在C#中,int
和Int32
是相同的,但我已多次阅读int
优先于Int32
而没有给出任何理由。有原因,我应该关心吗?
答案 0 :(得分:264)
这两者确实是同义词; int
看起来会更加熟悉,Int32
使那些阅读代码的人更加明确32位。我倾向于使用int
我需要'整数',Int32
,其中大小很重要(加密代码,结构),所以未来的维护者会知道放大{{1}是安全的如果合适,但应注意以同样的方式更改int
。
结果代码将是相同的:差异纯粹是可读性或代码外观。
答案 1 :(得分:126)
ECMA-334:2006 C#语言规范(第18页):
每种预定义类型都是系统提供的类型的简写。例如,关键字
int
引用结构System.Int32
。作为一种风格问题,使用关键字比使用完整的系统类型名称更受青睐。
答案 2 :(得分:84)
它们都声明了32位整数,并且正如其他海报所述,你使用哪一个主要是语法风格。然而,它们并不总是以相同的方式行事。例如,C#编译器不允许这样:
public enum MyEnum : Int32
{
member1 = 0
}
但它会允许这样:
public enum MyEnum : int
{
member1 = 0
}
去图。
答案 3 :(得分:48)
我总是使用系统类型 - 例如,Int32而不是int。我在阅读 Applied .NET Framework Programming 之后采用了这种做法 - 作者杰弗里里希特为使用完整的类型名称提供了一个很好的案例。以下是与我相关的两点:
类型名称可能因.NET语言而异。例如,在C#中,long
映射到System.Int64,而在带有托管扩展的C ++中,long
映射到Int32。由于语言可以在使用.NET时进行混合和匹配,因此无论读者的首选语言如何,您都可以确保使用显式类名称将更加清晰。
许多框架方法都将类型名称作为其方法名称的一部分:
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
答案 4 :(得分:20)
int是一个C#关键字,并且是明确的。
大多数情况下无关紧要,但有两件事与Int32相反:
答案 5 :(得分:13)
如前所述,int
= Int32
。为了安全起见,在实现任何关心数据类型边界的内容时,请务必始终使用int.MinValue
/ int.MaxValue
。假设.NET决定int
现在为Int64
,您的代码将更少依赖于边界。
答案 6 :(得分:9)
当您只需要处理单一语言时(对于您不必提醒自己有关数学溢出的代码),类型的字节大小并不太有趣。变得有趣的部分是当你在一种语言与另一种语言之间架起桥梁,C#与COM对象等等,或者你正在做一些变换或掩盖,你需要提醒自己(和你的代码审查共同工作者)数据的大小。
在实践中,我通常使用Int32来提醒自己它们的大小,因为我编写了托管C ++(例如桥接到C#)以及非托管/本机C ++。
您可能知道,在C#中是64位,但在本机C ++中,它最终为32位,或者char为unicode / 16位,而在C ++中则为8位。但我们怎么知道呢?答案是,因为我们已经在手册中查了一下它就这么说了。
有了时间和经验,当你编写代码以便在C#和其他语言之间架起桥梁时,你会开始变得更加谨慎(这里的一些读者正在思考“你为什么会这样?”),但恕我直言,我相信它是一个更好的练习,因为我不记得上周我编写的内容(或者我不必在我的API文档中指定“此参数是32位整数”)。
在F#中(虽然我从未使用过它),但它们定义了 int , int32 和 nativeint 。同样的问题应该出现,“我使用哪一个?”。正如其他人所提到的,在大多数情况下,它应该无关紧要(应该是透明的)。但我会选择int32和uint32来消除歧义。
我想这只取决于您编写的应用程序,使用者,您和您的团队遵循的编码实践等,以证明何时使用Int32。
答案 7 :(得分:8)
int
和Int32
之间没有区别,但由于int
是一种语言关键字,很多人都喜欢这种语言关键字(就像string
vs {{1}一样})。
答案 8 :(得分:7)
根据我的经验,这是一个常规的事情。我不知道在Int32上使用int的任何技术原因,但它是:
我特别喜欢最后一个。 :)
答案 9 :(得分:6)
我在定义变量时总是使用别名类型(int,string等),并在访问静态方法时使用实名:
int x, y;
...
String.Format ("{0}x{1}", x, y);
看到类似int.TryParse()的东西似乎很难看。除了风格之外别无其他原因。
答案 10 :(得分:5)
虽然它们(大部分)相同(请参阅下面的[bug]差异),但你绝对应该关心,你应该使用Int32。
16位整数的名称是Int16。对于64位整数,它是Int64,对于32位整数,直观的选择是:int或Int32?
Int16,Int32或Int64类型的变量大小的问题是自引用的,但int类型变量大小的问题是一个完全有效的问题和问题,无论如何琐碎,分散注意力,导致混乱,浪费时间,阻碍讨论等等(这个问题存在的事实证明了这一点)。
使用Int32可以促使开发人员意识到他们选择的类型。再一次int有多大?哦是的,32。当名称中包含大小时,实际考虑类型大小的可能性更大。使用Int32还可以提升对其他选择的了解。当人们不被迫至少认识到有替代品时,int变得太容易变成“整数型”。
框架中用于与32位整数交互的类名为Int32。再一次,这是:更直观,更少混淆,缺乏(不必要的)翻译(不是系统中的翻译,但是在开发人员的脑海中),等等int lMax = Int32.MaxValue
或Int32 lMax = Int32.MaxValue
?< / p>
int不是所有.NET语言中的关键字。
虽然有争议为什么它不太可能改变,但int可能并不总是Int32。
缺点是输入两个额外字符和[bug]。
这不会编译
public enum MyEnum : Int32
{
AEnum = 0
}
但这会:
public enum MyEnum : int
{
AEnum = 0
}
答案 11 :(得分:5)
我知道最好的做法是使用int,所有MSDN代码都使用int。但是,据我所知,没有超出标准化和一致性的理由。
答案 12 :(得分:4)
你不应该在乎。您应该在大多数时间使用int
。它将有助于将您的程序移植到更广泛的架构中(目前int
是System.Int32
的别名,但可能会改变)。仅当变量的位宽很重要时(例如:控制struct
内存中的布局),您应该使用int32
和其他(使用关联的“using System;
”)。
答案 13 :(得分:3)
曾几何时,int数据类型与编译器所针对的机器的寄存器大小挂钩。因此,例如,16位系统的编译器将使用16位整数。
然而,幸运的是,我们不再看到更多的16位,当64位开始流行时,人们更关心的是使它与旧软件兼容并且32位已经存在了很长时间以至于大多数编译器 int 只是假设为32位。
答案 14 :(得分:3)
int是C#语言的System.Int32
的快捷方式虽然这确实意味着微软可以改变这种映射,但有关FogCreek讨论的帖子称[source]
“在64位问题上 - 微软确实在开发64位版本的.NET Framework,但我很确定int不会映射到该系统上的64位。
理由:
1。 C#ECMA标准明确指出int为32位,long为64位。
2。微软推出了其他属性&amp; Framework 1.1版中的方法,它返回long值而不是int值,例如Array.GetLongLength以及Array.GetLength。
所以我认为可以肯定地说所有内置的C#类型都会保留其当前的映射。“
答案 15 :(得分:3)
我建议使用Microsoft的StyleCop。
就像FxCop,但与风格相关的问题。默认配置与Microsoft的内部样式指南相匹配,但可以为您的项目自定义。
可能需要一些时间来习惯,但它肯定会使你的代码更好。
您可以将其包含在构建过程中,以自动检查违规行为。
答案 16 :(得分:3)
int与System.Int32相同,编译时会在CIL中变成相同的东西。
我们在C#中按惯例使用int,因为C#看起来像C和C ++(和Java),这就是我们在那里使用的...
顺便说一句,我在声明导入各种Windows API函数时最终使用System.Int32。我不确定这是否是一个定义的约定,但它提醒我,我要去外部DLL ...
答案 17 :(得分:2)
在实践中没有任何区别,你会采用自己的惯例。我倾向于在分配类型时使用关键字,在使用静态方法时使用类版本:
int total = Int32.Parse(“1009”);
答案 18 :(得分:2)
你不应该在乎。如果大小是一个问题,我会使用byte,short,int,然后long。你使用大于int32的int的唯一原因是你需要一个高于2147483647或低于-2147483648的数字。
除了我不在乎之外,还有很多其他项目需要关注。
答案 19 :(得分:2)
int
和Int32
是一样的。 int
是Int32
的别名。
答案 20 :(得分:1)
如果Microsoft将整数的默认实现更改为某个新的版本(我们称之为Int32b),我使用int。
然后,Microsoft可以将int别名更改为Int32b,并且我不必更改任何代码以利用其新的(并且希望改进的)整数实现。
任何类型关键字也是如此。
答案 21 :(得分:1)
int
是System.Int32
的别名,如下表所示:
Built-In Types Table (C# Reference)
答案 22 :(得分:0)
还要考虑Int16。如果你需要在你的应用程序的内存中存储一个Integer并且你担心使用的内存量,那么你可以使用Int16,因为它使用更少的内存并且具有比Int32更小的最小/最大范围(这是int是什么。)
答案 23 :(得分:0)
使用Int32
类型需要对System
或完全限定(System.Int32
)的命名空间引用。我倾向于int
,因为它不需要命名空间导入,因此在某些情况下减少命名空间冲突的可能性。编译为IL时,两者之间没有区别。
答案 24 :(得分:0)
前一段时间,当我们访问Microsoft .NET CLR产品团队的某个人时,我正在与Microsoft合作开展一个项目。这个人编写了例子,当他定义他的变量时,他使用“Int32”对“int”和“String”对比“string”。
我记得在微软的其他示例代码中看到了这种风格。所以,我做了一些研究,发现每个人都说除了语法着色之外,“Int32”和“int”之间没有区别。事实上,我发现很多材料建议您使用“Int32”来使您的代码更具可读性。所以,我采用了这种风格。
前几天我确实找到了不同之处!编译器不允许您使用“Int32”键入枚举,但是当您使用“int”时它会执行。不要问我为什么,因为我还不知道。
示例:
public enum MyEnum : Int32
{
AEnum = 0
}
这很有效。
public enum MyEnum : int
{
AEnum = 0
}
答案 25 :(得分:0)
没关系。 int是语言关键字,Int32是实际的系统类型。
另请参阅我的answer here相关问题。
答案 26 :(得分:0)
使用Int或Int32是相同的Int只是简化读取器代码的糖。
使用Nullable变体Int?还是Int32?在包含null的字段上使用数据库时。这样可以避免许多运行时问题。
答案 27 :(得分:0)
某些编译器在不同平台上具有不同的int大小(不是C#特定的)
某些编码标准(MISRA C)要求使用的所有类型都是指定的大小(即Int32而不是int)。
为不同的类型变量指定前缀也很好(例如b表示8位字节,w表示16位字,l表示32位长字=&gt; Int32 lMyVariable)
你应该关心,因为它使你的代码更便携,更易于维护。
如果您总是要使用C#,则Portable可能不适用于C#,而C#规范在这方面永远不会改变。
可维护的ihmo将始终适用,因为维护代码的人可能不知道这个特定的C#规范,并且错过了一个错误,因为int偶尔会超过2147483647。
在一个简单的for循环中,例如计算一年中的几个月,你不会在意,但是当你在可能有权力的情境中使用变量时,你应该关心。
您还应该关心是否要对其进行逐位操作。
答案 28 :(得分:0)
您不应该关心大多数编程语言,除非您需要编写非常具体的数学函数或针对特定架构优化的代码...只需确保类型的大小足够您(使用大于Int如果你知道,你需要超过32位的话)
答案 29 :(得分:0)
根据Visual Studio 2012中的立即窗口Int32是int,Int64很长。这是输出:
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
答案 30 :(得分:-1)
int可以保存的字节取决于你为它编译的内容,因此当你编译32位处理器的程序时,它保存的数字从2 ^ 32/2到-2 ^ 32/2 + 1,而编译为64它可以容纳2 ^ 64/2到-2 ^ 64/2 + 1。 int32将始终保持2 ^ 32个值。
编辑:忽略我的回答,我没有看到C#。我的回答是针对C和C ++的。我从未使用过C#
答案 31 :(得分:-4)
我记得老Borland的日子和int不仅依赖于你的机器,而且依赖于你的编译器。所以这里的真正要点是 - 如果你是一个草率的编码器,那么使用任何东西并继续这样。
如果您担心内存管理,那么请考虑为什么C#是一种强类型语言,并且有一个原因,你有int32,int64和int16。
考虑一下:
for (int i=0; i<100; i++) { }
和
for (Int16 i=0; i<100; i++) { }
和
for (Int64 i=0; i<100; i++) { }
哪一项效率最高? INT16!你可以争辩说CIL它们是相同的,但是如果你的调用函数有1000次线程怎么办?那已经是4 kB(原文如此)的内存,你只是浪费了。
真正的程序员会使用较小的名称,尽管它可能没有不同,因为在语义上它更正确,并且可能在将来的某些编译事项中。其余的业余爱好者可以继续关注细节,你的代码会很糟糕,因为你并不关心它。它就像一个freekin'植物。爱它!不要马虎!
答案 32 :(得分:-11)
在x86平台上Int == Int32。但是在x64 Int == Int64。
答案 33 :(得分:-13)
使用int代替Int32并不是一个很好的做法,因为很多答案都说明了,但是有充分的理由。 Int32总是32位,int在32x系统中是32位,在64x系统中是64位。