在C#中,为什么“int”是System.Int32的别名?
由于C#支持Int8
, Int16
, Int32
和Int64
,为什么语言的devise者select将Int32
定义为Int32
的别名,而不是根据本机体系结构认为是一个word
而使其变化?
我没有任何具体的需要,以行为不同于它的方式,我只是要求出纯粹的百科兴趣。
我认为64位RISC架构可能会存在,它将最有效地支持64位数量,并且其中32位数量的操作将需要额外的操作。 这样的架构在程序坚持使用32位整数的世界中处于劣势,这是另一种说C#成为未来语言的方式,从根本上防止了硬件devise者提出这样的问题未来的架构。
StackOverflow不鼓励推测答案,所以只有当你的信息来自可靠的来源时,请回答。 我注意到一些SO的成员是微软的内部人士,所以我希望他们能够在这个问题上启发我们。
注1:其实我读了所有的答案和SO的所有评论:假设在C#中int总是32位是安全的吗? 但对于我在这个问题上提出的问题,却没有提出任何暗示。
注2:这个问题在SO上的可行性(无疑)在这里讨论: Meta:我可以问一个“他们为什么这样做”types的问题?
我相信他们的主要原因是针对CLR的程序的可移植性。 如果他们允许像int
这样基本的types是平台依赖的,那么为CLR制作便携式程序将变得更加困难。 在平台中立的C / C ++代码中为了覆盖内置int
的使用而扩展typedef
-ed int
是间接的暗示,为什么CLR的devise者决定让内置types与平台无关。 这种差异是基于虚拟机的执行系统的“一次写入,随处运行”目标的一个很大的抑制因素。
编辑通常情况下, int
的大小通过位操作而不是通过算术来隐式地播放到你的代码中(毕竟, i++
有可能出错,对吗?)但是这些错误通常更加微妙。 考虑下面的例子:
const int MaxItem = 20; var item = new MyItem[MaxItem]; for (int mask = 1 ; mask != (1<<MaxItem) ; mask++) { var combination = new HashSet<MyItem>(); for (int i = 0 ; i != MaxItem ; i++) { if ((mask & (1<<i)) != 0) { combination.Add(item[i]); } } ProcessCombination(combination); }
此代码计算和处理20个项目的所有组合。 正如你所看到的,代码在一个16位int
的系统上失败了,但是在32或者64位的整数下工作正常。
不安全的代码会提供另一个令人头痛的源头:当int
被固定为一定的大小(比如说32)时,即使它在技术上是不正确的使用4来代替sizeof(int)
。 此外,这个技术上不正确的代码将保持便携!
最终,像这样的小事情,对平台的看法“很好”或“不好”的影响很大。 .NET程序的用户不关心程序崩溃,因为程序员犯了一个不可移植的错误,或者CLR是错误的。 这与早期的Windows由于司机质量差而被广泛认为是非稳定的类似。 对于大多数用户来说,崩溃只是另一个.NET程序崩溃,而不是程序员的问题。 因此,对“.NET生态系统”的感知有利于使得标准尽可能宽容。
许多程序员倾向于为他们使用的平台编写代码。 这包括关于types的大小的假设。 有很多的C程序,如果一个int的大小被改为16或者64位,那么它们会失败,因为它们是在int为32位的情况下被写入的。 C#的select通过简单地定义它来避免这个问题。 如果将int定义为variables,则取决于您回到同一问题的平台。 虽然你可以争辩说,这是程序员做出错误假设的错误,但它使得语言更强大(IMO)。 而对于桌面平台来说,32位int可能是最常见的事件。 除此之外,它使原生C代码移植到C#更容易一些。
编辑 :我认为你写的代码,使得(隐式)关于一个types的sizer更经常比你想象的假设。 基本上,任何涉及序列化的东西(比如.NET远程处理,WCF,将数据序列化到磁盘等等)都会给你带来麻烦,如果你允许int的variables大小,除非程序员通过使用特定大小的types如int32
。 然后,你最终会“无论如何总是使用int32”,而你什么都没有获得。