我应该使用int还是Int32


352

在C#中,int并且Int32是同样的事情,但我读了许多那个时代int优于Int32没有给出理由。请问有什么理由吗?


Skeet对此发了一条推文,在编写API时,他更喜欢Int32。
comecme 2011年

@JohnBubriski:并且不要忘了它需要使用更少的using语句来使用它(否则您将要键入System.Int32
2011年

我有一个问题:我们不是直接使用CLR类型,而是为什么我们需要它们?
AminM 2013年

@JohnBubriski Facebook状态更新比代码段更容易键入。那里的想法不好!易于阅读和理解远比打字容易重要。When something can be read without effort, great effort has gone into its writing. Easy writing is hard reading
7hi4g0 2014年

Answers:


134

ECMA-334:2006 C#语言规范(p18):

每个预定义类型都是系统提供的类型的简写。例如,关键字int指的是struct System.Int32。就样式而言,使用关键字比使用完整的系统类型名称更受青睐。


271

两者确实是同义词。int看起来会更加熟悉,Int32使32位代码对阅读代码的人更加明确。我倾向于int在我只需要'integer'的Int32地方使用,这里的大小很重要(加密代码,结构),因此将来的维护者将知道int适当地扩大a是安全的,但应注意Int32以相同的方式进行更改。

结果代码将是相同的:区别仅仅是可读性或代码外观之一。


65
读取您的代码的人应该知道int是System.Int32的别名。关于可读性,一致性要重要得多。
Troels Thomsen

11
对于那些拥有旧C ++思维方式的人,IntPtr设计为在32位OS上为32位,在64位OS上为64位。此行为在其摘要标记中特别提到。msdn.microsoft.com/zh-CN/library/system.intptr(VS.71).aspx
王冠2010年

87

它们都声明了32位整数,并且正如其他张贴者所指出的那样,您使用的主要是语法风格的问题。但是,它们的行为并不总是相同的。例如,C#编译器不允许这样做:

public enum MyEnum : Int32
{
    member1 = 0
}

但这将允许:

public enum MyEnum : int
{
    member1 = 0
}

去搞清楚。


9
如果使用Reflector检查System.Int32类型,则会发现它是结构而不是类。代码如下所示:[可序列化,StructLayout(LayoutKind.Sequential),ComVisible(true)]公共结构Int32:IComparable,IFormattable,IConvertible,IComparable <int>,IEquatable <int> {public const int MaxValue = 0x7fffffff; ...您不能从结构派生类型。至少您会得到一个错误提示。但是,枚举的行为有些不同,接下来我将对其进行评论。
raddevus 2010年

16
无法从Int32派生枚举是一种设计好的行为,也可以通过查看.NET代码来看出:[Serializable,ComVisible(true)]公共抽象类Enum:ValueType,IComparable,IFormattable,请注意,Enum是派生的来自ValueType?如果您尝试从固有数据类型(int,byte等)之外的其他内容派生枚举,则会收到如下错误:类型为byte,sbyte,short,ushort,int,uint,long或ulong 。
raddevus 2010年

2
@daylight请注意,指定enum要使用int的不是derive,而是指定underlying type;参见msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
Jeroen Wiert Pluimers 2013年

2
@JeroenWiertPluimers但是,为什么他们选择从字面上检查基础类型并抛出CS1008仍然很有趣,因为基础类型只是枚举中常量的类型,因此在编译时并不重要。
IllidanS4希望莫妮卡回到2014年

5
@ IllidanS4,使用新的编译器Roslyn-已修复,并且两个变体均有效
Grundy

49

我总是使用系统类型-例如,Int32而不是int。在阅读Applied .NET Framework编程后,我采用了这种做法-作者Jeffrey Richter为使用完整类型名提供了一个很好的案例。这是我的两点:

  1. 类型名称在.NET语言之间可能有所不同。例如,在C#中,long映射到System.Int64,而在具有托管扩展的C ++中,long映射到Int32。由于在使用.NET时可以混合使用多种语言,因此可以确保无论读者喜欢哪种语言,使用显式类名始终会更加清晰。

  2. 许多框架方法将类型名称作为其方法名称的一部分:

    BinaryReader br = new BinaryReader( /* ... */ );
    float val = br.ReadSingle();     // OK, but it looks a little odd...
    Single val = br.ReadSingle();    // OK, and is easier to read

这样做的问题是Visual Studio自动完成功能仍使用int。因此,如果创建一个List<Tuple<Int32, Boolean>> test = new,Visual Studio现在将插入List<Tuple<int, bool>>()。您是否知道更改这些自动完成的方法?
MrFox

2
是的,这是一个问题;不,我不知道如何立即更改它们。对我来说,第二点不再是问题,因为我倾向于var尽可能地减少代码的冗长性。在偶尔出现自动完成并喷在地板上的地方,我会手动进行调整-这实际上是我的一两秒钟。
Remi Despres-Smyth,

20

int是C#关键字,没有歧义。

在大多数情况下,这并不重要,但是有两点与Int32相抵触:

  • 您需要一个“使用系统”;声明。使用“ int”不需要使用using语句。
  • 可以定义自己的名为Int32的类(这很愚蠢且令人困惑)。int始终表示int。

也可以创建自己的“ var”类,但这并不妨碍人们使用它。
Neme,

每个关键字都是一个C#关键字。int已经在C和C ++中使用。因此,没有什么特别的C#。
MrFox

12

如前所述,int= Int32。为了安全起见,在实现任何关心数据类型边界的内容时,请务必始终使用int.MinValue/ int.MaxValue。假设.NET决定int现在这样Int64,您的代码将不再依赖于边界。


8
@spoulson:第1行的注释错误:禁止在相同类型之间进行分配。是的,一个坏笑话。
Johann Gerell '01

22
如果C#规范(这是一个C#,没有.NET决定)是否已经决定转变,使int64位,这将是这样一个重大更改,我不相信这是可能(或肯定明智)代码防守对抗这种可能性。
乔恩·斯基特

9

当您只需要使用一种语言(对于不需要提醒自己有关数学溢出的代码)时,类型的字节大小就不太有趣了。变得有趣的部分是当您在一种语言与另一种语言之间,从C#到COM对象等之间进行桥接时,或者您正在进行某些移位或屏蔽时,您需要提醒自己(以及代码审查合作伙伴)数据大小。

实际上,我通常使用Int32来提醒自己它们的大小,因为我确实写了托管C ++(例如,桥接到C#)以及非托管/本机C ++。

如您所知,在C#中为64位,但是在本机C ++中,它最终为32位,或者char为unicode / 16位,而在C ++中为8位。但是我们怎么知道呢?答案是,因为我们已经在手册中进行了查找,因此是这样。

凭借时间和经验,当您编写用于在C#和其他语言之间架桥的代码时,您将开始更加认真地对待类型(这里有些读者在思考“您为什么?”),但是恕我直言,我认为这是一种更好的做法,因为我不记得上周编写的代码(或者我不必在我的API文档中指定“此参数是32位整数”)。

F#中(尽管我从未使用过),它们定义了int int32nativeint。将会出现相同的问题,“我使用哪个?”。正如其他人所提到的,在大多数情况下,这无关紧要(应该透明)。但是我会选择int32和uint32只是为了消除歧义。

我猜这将取决于您正在编码的应用程序,正在使用的应用程序,您和您的团队遵循的编码实践等等,以证明何时使用Int32是合理的。


这是否会使.net的目的无效?F#到底是什么,盖茨的想法随着退休而消失了……
Nick Turner

8

int和之间没有区别Int32,但是正如int许多语言上喜欢的语言关键字一样,它们在样式上也很喜欢(就像stringvs一样String)。


7

以我的经验,这是很常规的事情。我不知道在Int32上使用int的任何技术原因,但这是:

  1. 打字更快。
  2. 典型的C#开发人员更加熟悉。
  3. 默认Visual Studio语法突出显示中的其他颜色。

我特别喜欢最后一个。:)


7

在定义变量时,我总是使用别名类型(int,字符串等),在访问静态方法时,我总是使用真实名称:

int x, y;
...
String.Format ("{0}x{1}", x, y);

看到类似int.TryParse()的东西看起来很丑。除了样式,我没有其他原因。


5

我知道最佳实践是使用int,并且所有MSDN代码都使用int。但是,据我所知,除了标准化和一致性外,没有其他理由。


5

尽管它们(大部分)是相同的(请参见下面的一个[bug]区别),但您绝对应该注意并应该使用Int32。

  • 16位整数的名称为Int16。对于64位整数,它是Int64,对于32位整数,直观的选择是:int还是Int32?

  • Int16,Int32或Int64类型的变量大小的问题是自引用的,但是int类型的变量大小的问题是一个完全有效的问题,无论多么琐碎,都会使人分心,导致造成混乱,浪费时间,阻碍讨论等(这个问题的存在证明了这一点)。

  • 使用Int32可以使开发人员意识到他们对类型的选择。int又有多大?哦,是的,32.当名称中包含大小时,实际考虑类型大小的可能性更大。使用Int32还可以提高其他选择的知识。当人们没有被迫至少意识到有其他选择时,int变得太容易成为“整数类型”了。

  • 框架中旨在与32位整数进行交互的类称为Int32。再次,它是:更直观,减少混乱,缺乏一个(不必要的)翻译(而不是在系统中的翻译,但在开发商的头脑)等 int lMax = Int32.MaxValueInt32 lMax = Int32.MaxValue

  • int不是所有.NET语言中的关键字。

  • 尽管有人争论为什么它永远不会改变,但int不一定总是Int32。

缺点是要键入两个额外的字符和[bug]。

这不会编译

public enum MyEnum : Int32
{
    AEnum = 0
}

但这将:

public enum MyEnum : int
{
    AEnum = 0
}

您说“ 16位整数的名称是Int16,64位整数的名称是Int64,而对于32位整数的名称,直观的选择是:int或Int32?”,但是这些名称也有C#关键字。Int16 = short Int64 = long因此,您的答案之一是基于错误的假设。
梅尔

“类型为int的变量是一个完全有效的问题,无论多么琐碎,令人分心,导致混乱,浪费时间,阻碍讨论等(这个问题的存在证明了这一点)。” 你在跟我开玩笑吗?您使用的语言无法完全理解背后的内容。如果开发人员不了解原始类型等于什么,那么他应该学习烹饪艺术。听起来像VB开发人员。使用原语是任何语言的本机,应优先使用。如果您不喜欢基元,但不弥补现实,那就很好。
Nick Turner

嗯,我完全不同意您的意见,我应该在意……但我不知道枚举只能从关键字继承。一个无用的事实,但仍然很有趣:)
Jowen

4

你不在乎 您应该int大部分时间使用。它将有助于将来将程序移植到更广泛的体系结构(当前int是它的别名,System.Int32但可能会发生变化)。仅当变量的位宽很重要时(例如:要控制a的内存中的布局struct),才应使用int32和其他变量(以及关联的“ using System;”)。


1
你可以不认真...使移植变得容易吗?我认为找不到并替换没有什么大不了的。
文斯·帕努奇

2
(当前int是System.Int32的别名,但可能会更改)?哦,一个...你是认真的吗?
奥伊贝克(Oybek)2011年

为什么要用最终要破坏的语言编写代码?好像是由管理决定。使用int或Int32。Int32看起来像VB
Nick Turner

我的意思是说MAYBE(这是一个很大的MAYBE,我真的不知道为什么设计师会那样做),您应该有一种方法来声明一个int,该int与您在其上运行的拱形具有相同的宽度,就像C的int / long / ...一样。这是一种机制(似乎是int32的int),似乎可以做到这一点。并考虑到Microsoft始终建议使用“ int”与“ Int32”(就像他们原本打算的那样)。我知道,这是一个很大的IF ...当我编写此答案时,没有任何64位.NET框架,因此我不知道在这种情况下它们会做什么。
YankoHernándezAlvarez

3

int是System.Int32的C#语言快捷方式

尽管这确实意味着Microsoft可以更改此映射,但有关FogCreek讨论的帖子指出[来源]

“在64位问题上–微软确实正在开发64位版本的.NET Framework,但我很确定int不会映射到该系统上的64位。

原因:

1. C#ECMA标准专门指出int是32位,而long是64位。

2. Microsoft在Framework版本1.1中引入了其他属性和方法,这些属性和方法返回长值而不是int值,例如Array.GetLongLength和Array.GetLength。

因此,我可以肯定地说所有内置C#类型都将保留其当前映射。”


如果引入了64位版本,则他们可能会在C#中添加“ nativeint”(因为F#中当前使用了它)。这只是在强调引入“ int”并将其定义为Int32是错误的!因此从API(即ReadInt32而不是ReadInt),颜色(深色与浅蓝色)和区分大小写(DateTime与int)的角度来看是不一致的。即为什么值类型'DateTime'没有像Int32这样的别名?
卡洛·波斯

3

int与System.Int32相同,并且在编译时将在CIL中变成相同的东西。

我们在C#中按惯例使用int,因为C#想要看起来像C和C ++(和Java),这就是我们在这里使用的...

顺便说一句,在声明各种Windows API函数的导入时,我确实使用了System.Int32。我不确定这是否是已定义的约定,但它提醒我要使用外部DLL ...


3

从前,int数据类型与编译器目标机器的寄存器大小挂钩。因此,例如,用于16位系统的编译器将使用16位整数。

但是,幸运的是,我们再也看不到16位了,当64位开始流行时,人们开始更加关注使其与较旧的软件兼容,而32位已经存在了很长时间,因此对于大多数编译器来说,int仅假定为32位。


3

我建议使用Microsoft的StyleCop

它类似于FxCop,但是涉及样式相关的问题。默认配置与Microsoft的内部样式指南相匹配,但是可以为您的项目自定义。

可能需要一点时间来习惯,但绝对可以使您的代码更好。

您可以将其包括在构建过程中以自动检查违规情况。


我完全不同意对此的StyleCop。是的,这很好,但是我更喜欢使用Int32,为什么?以避免像两个被否决的答案。人们将Int32与int在C语言中的表示方式混淆
John Demetriou 2015年

2

int并且Int32是相同的。int是的别名Int32


int不是别名,它是一个关键字。查看其他答案。
Timores 2010年

int绝对是该语言的关键字,但也可以称为System.Int32的别名。另外,另一种思考方式是您using int = System.Int32; 对所有源代码文件都有 指令。
uygar donduran 2013年

2

你不在乎 如果要考虑大小,我将使用byte,short,int和long。使用大于int32的int的唯一原因是,如果您需要一个大于2147483647或小于-2147483648的数字。

除了我不在乎之外,还有很多其他需要关注的项目。


我要补充一点,您可以使用关键字“ long”代替System.Int64
Keith

22
您误解了这个问题。OP正在询问声明“ int i”和“ Int32 i”之间是否存在差异。
乌鸦

2

在实践中没有什么区别,随着时间的流逝,您将采用自己的约定。我倾向于在分配类型时使用关键字,而在使用静态方法时使用类版本:

int total = Int32.Parse("1009");


1

如果Microsoft将整数的默认实现更改为某些新的带版本版本(我们将其称为Int32b),则使用int。

然后,Microsoft可以将int别名更改为Int32b,并且我不必更改任何代码即可利用其新的(并有望得到改进)整数实现。

任何类型的关键字也是如此。


0

您无需关心大多数编程语言,除非您需要编写非常具体的数学函数或针对一种特定体系结构进行了优化的代码...只需确保类型的大小足以满足您的需要(如果您使用的是大于Int的类型,知道您将需要超过32位)


0

没关系 int是语言关键字,而Int32是其实际系统类型。

另请参见我在这里回答一个相关的问题。


0

使用Int或Int32都是一样的Int只是为了简化读者的代码而已。

使用Nullable变体Int吗?还是Int32?当您在包含null的字段上使用数据库时。这样可以避免许多运行时问题。


0

某些编译器在不同平台上具有不同的int大小(不是特定于C#)

一些编码标准(MISRA C)要求使用的所有类型都必须指定大小(即Int32而不是int)。

为不同类型的变量指定前缀也很好(例如,b表示8位字节,w表示16位字,l表示32位长字=> Int32 lMyVariable)

您应该注意,因为它使您的代码更具可移植性和可维护性。

如果您将始终使用C#,并且Portable C#规范在这方面永远不会改变,则Portable可能不适用于C#。

可维护的ihmo将始终适用,因为维护您代码的人员可能不了解此特定C#规范,并且在int偶尔超过2147483647的情况下错过了一个错误。

在一个简单的for循环中,例如一年中的月份,您将不在乎,但是当您在变量可能会顺流的情况下使用变量时,您应该在意。

您还应该注意是否要对其进行按位操作。


它在.Net中没有区别-int始终是Int32,而long始终是Int64
Keith

It is also good to specify prefixes for different type variables如今,匈牙利的符号已被弃用,大多数编码风格都不鼓励使用它。软件公司的内部惯例也经常禁止使用该符号
-phuclv

0

使用Int32类型需要名称空间引用System或完全限定(System.Int32)。我倾向于int,因为它不需要导入名称空间,因此在某些情况下减少了名称空间冲突的机会。当编译为IL时,两者之间没有区别。


0

根据Visual Studio 2012中的即时窗口,Int32为int,Int64为long。这是输出:

sizeof(int)
4
sizeof(Int32)
4
sizeof(Int64)
8
Int32
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
Int64
long
    base {System.ValueType}: System.ValueType
    MaxValue: 9223372036854775807
    MinValue: -9223372036854775808
int
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648

0

还要考虑Int16。如果您需要在应用程序的内存中存储一​​个Integer,并且担心使用的内存量,则可以使用Int16,因为它使用的内存较少,并且最小/最大范围比Int32小(这就是int )


0

不久前,当我们拜访Microsoft .NET CLR产品团队中的某人时,我正在与Microsoft合作开展一个项目。这个人编写了示例代码,当他定义变量时,他使用了“ Int32”和“ int”以及“ String”和“ string”。

我还记得在Microsoft的其他示例代码中看到过这种样式。因此,我进行了一些研究,发现每个人都说“ Int32”和“ int”之间没有区别,除了语法着色。实际上,我发现很多材料建议您使用“ Int32”使代码更具可读性。因此,我采用了这种风格。

前几天,我确实发现了差异!编译器不允许您使用“ Int32”键入enum,但是当您使用“ int”时可以。不要问我为什么,因为我还不知道。

例:

public  enum MyEnum : Int32
{
    AEnum = 0
}

这可行。

public enum MyEnum : int
{
    AEnum = 0
}

摘自:Int32表示法与int

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.