在c#中,int和Int32是同一个东西,但我读过很多次int比Int32更受欢迎,没有给出原因。这是有原因的吗,我应该在意吗?
当前回答
当您只需要处理一种语言时,类型的字节大小就不太有趣了(对于那些不需要提醒自己数学溢出的代码)。有趣的部分是当你在一种语言和另一种语言之间建立桥梁,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。
附录: 顺便说一句,自从我几年前回答了这个问题之后,我就开始同时使用f#和Rust了。f#,它都是关于类型推断,以及c#和f#之间的桥接/互操作,本机类型匹配,所以不用担心;我很少需要在f#中显式地定义类型(如果不使用类型推断,这几乎是一种罪过)。在Rust中,他们完全消除了这种歧义,你必须使用i32 vs u32;总而言之,减少歧义有助于减少bug。
其他回答
根据我的经验,这是一种惯例。我不知道在Int32上使用int的任何技术原因,但它是:
打字更快。 对于典型的c#开发人员来说更加熟悉。 默认visual studio语法高亮显示的不同颜色。
我特别喜欢最后一个。:)
虽然它们(大部分)是相同的(参见下面的一个[错误]差异),但您绝对应该注意并应该使用Int32。
The name for a 16-bit integer is Int16. For a 64 bit integer it's Int64, and for a 32-bit integer the intuitive choice is: int or Int32? The question of the size of a variable of type Int16, Int32, or Int64 is self-referencing, but the question of the size of a variable of type int is a perfectly valid question and questions, no matter how trivial, are distracting, lead to confusion, waste time, hinder discussion, etc. (the fact this question exists proves the point). Using Int32 promotes that the developer is conscious of their choice of type. How big is an int again? Oh yeah, 32. The likelihood that the size of the type will actually be considered is greater when the size is included in the name. Using Int32 also promotes knowledge of the other choices. When people aren't forced to at least recognize there are alternatives it become far too easy for int to become "THE integer type". The class within the framework intended to interact with 32-bit integers is named Int32. Once again, which is: more intuitive, less confusing, lacks an (unnecessary) translation (not a translation in the system, but in the mind of the developer), etc. int lMax = Int32.MaxValue or Int32 lMax = Int32.MaxValue? int isn't a keyword in all .NET languages. Although there are arguments why it's not likely to ever change, int may not always be an Int32.
缺点是要多输入两个字符和[bug]。
这不会编译
public enum MyEnum : Int32
{
AEnum = 0
}
但这将:
public enum MyEnum : int
{
AEnum = 0
}
一些编译器在不同的平台上对int有不同的大小(不是c#特定的)
一些编码标准(MISRA C)要求所有使用的类型都指定大小(即Int32而不是int)。
为不同类型的变量指定前缀也很好(例如,b表示8位字节,w表示16位字,l表示32位长字=> Int32 lMyVariable)
您应该关心,因为它使您的代码更具可移植性和可维护性。
如果你总是要使用c#,而且c#规范在这方面永远不会改变,那么可移植可能不适用于c#。
可维护的ihmo将始终适用,因为维护代码的人可能不知道这个特定的c#规范,并且错过了int偶尔超过2147483647的错误。
在简单的for循环中,例如计算一年中的月份,您不会关心,但是当您在一个可能会owerflow的上下文中使用该变量时,您应该关心。
您还应该注意是否要对它进行逐位操作。
曾经,int数据类型与编译器目标机器的寄存器大小挂钩。例如,16位系统的编译器将使用16位整数。
然而,谢天谢地,我们已经很少看到16位了,当64位开始流行时,人们更关心的是使它与旧软件兼容,32位已经存在了很长时间,对于大多数编译器来说,int只是假设为32位。
当您只需要处理一种语言时,类型的字节大小就不太有趣了(对于那些不需要提醒自己数学溢出的代码)。有趣的部分是当你在一种语言和另一种语言之间建立桥梁,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。
附录: 顺便说一句,自从我几年前回答了这个问题之后,我就开始同时使用f#和Rust了。f#,它都是关于类型推断,以及c#和f#之间的桥接/互操作,本机类型匹配,所以不用担心;我很少需要在f#中显式地定义类型(如果不使用类型推断,这几乎是一种罪过)。在Rust中,他们完全消除了这种歧义,你必须使用i32 vs u32;总而言之,减少歧义有助于减少bug。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和