关于c#:我应该使用int还是Int32

关于c#:我应该使用int还是Int32

Should I use int or Int32

在C#中,intInt32是同一件事,但是我已经读过很多次,没有给出原因,intInt32更受青睐。 有原因吗,我应该在乎吗?


两者确实是同义词。 int看起来会更熟悉,Int32使32位内容对于阅读代码的人更加明确。我倾向于使用int,而我只需要一个"整数",而Int32的大小很重要(加密代码,结构),因此将来的维护者将知道在适当的情况下放大int是安全的,但应该请注意以相同的方式更改Int32

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


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

Each of the predefined types is shorthand for a system-provided type. For example, the keyword int refers to the struct System.Int32. As a matter of style, use of the keyword is favoured over use of the complete system type name.


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

1
2
3
4
public enum MyEnum : Int32
{
    member1 = 0
}

但这将允许:

1
2
3
4
public enum MyEnum : int
{
    member1 = 0
}

去搞清楚。


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

  • 类型名称在.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


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

    在大多数情况下,这并不重要,但是有两点与Int32背道而驰:

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

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


    当您只需要使用一种语言(对于不需要提醒自己有关数学溢出的代码)时,类型的字节大小就不太有趣了。变得有趣的部分是当您在一种语言与另一种语言之间,从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是合理的。


    intInt32之间没有区别,但是由于int是很多人在风格上喜欢它的语言关键字(就像stringstring一样)。


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

  • 打字更快。
  • 对典型的C#开发人员更熟悉。
  • 默认的Visual Studio语法突出显示中的其他颜色。
  • 我特别喜欢最后一个。 :)


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

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

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


    尽管它们(大部分)是相同的(请参见下面的[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]。

    这不会编译

    1
    2
    3
    4
    public enum MyEnum : Int32
    {
        AEnum = 0
    }

    但这将:

    1
    2
    3
    4
    public enum MyEnum : int
    {
        AEnum = 0
    }

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


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


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

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


    我建议使用Microsoft的StyleCop。

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

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

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


    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#类型都将保留其当前映射。"


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

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

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


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

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


    intInt32相同。 intInt32的别名。


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

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


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

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

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


    intSystem.Int32的别名,如下表所示:
    内置类型表(C#参考)


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


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

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

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

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

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

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

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

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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

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


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


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

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

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

    例:

    1
    2
    3
    4
    public  enum MyEnum : Int32
    {
        AEnum = 0
    }

    这可行。

    1
    2
    3
    4
    public enum MyEnum : int
    {
        AEnum = 0
    }

    摘自:Int32表示法与int


    使用Int或Int32都是一样的Int只是糖,可以简化读者的代码。

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


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

    另请参阅我对相关问题的回答。


    int可以容纳的字节数取决于编译的目的,因此,当您为32位处理器编译程序时,它可以容纳2 ^ 32/2到-2 ^ 32/2 + 1的数字,而对于64位则可以保持从2 ^ 64/2到-2 ^ 64/2 + 1。 int32将始终保存2 ^ 32个值。

    编辑:忽略我的答案,我没有看到C#。我的答案是针对C和C ++的。我从没用过C#


    推荐阅读