我应该使用int还是Int32

时间:2008-09-15 12:49:51

标签: c# variable-types

在C#中,intInt32是相同的,但我已多次阅读int优先于Int32而没有给出任何理由。有原因,我应该关心吗?

34 个答案:

答案 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 之后采​​用了这种做法 - 作者杰弗里里希特为使用完整的类型名称提供了一个很好的案例。以下是与我相关的两点:

  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

答案 4 :(得分:20)

int是一个C#关键字,并且是明确的。

大多数情况下无关紧要,但有两件事与Int32相反:

  • 你需要一个“使用系统”;声明。使用“int”不需要使用语句。
  • 可以定义自己的类Int32(这会很愚蠢和令人困惑)。 int总是指int。

答案 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)

intInt32之间没有区别,但由于int是一种语言关键字,很多人都喜欢这种语言关键字(就像string vs {{1}一样})。

答案 8 :(得分:7)

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

  1. 更快打字。
  2. 对典型的C#开发人员更熟悉。
  3. 默认visual studio语法高亮显示中的不同颜色。
  4. 我特别喜欢最后一个。 :)

答案 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.MaxValueInt32 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。它将有助于将您的程序移植到更广泛的架构中(目前intSystem.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)

intInt32是一样的。 intInt32的别名。

答案 20 :(得分:1)

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

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

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

答案 21 :(得分:1)

intSystem.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
}

取自:Int32 notation vs. int

答案 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位。