在C#中,为什么“int”是System.Int32的别名?
由于C#支持Int8
, Int16
, Int32
和Int64
,为什么该语言的设计人员选择将int
定义为Int32
的别名,而不是根据本机体系结构认为是一个word
而使其变化?
我没有任何特别的需要int
的行为有别于它的行为方式,我只是要求纯粹的百科兴趣。
我认为可以设想一个64位RISC架构,它可以最有效地支持64位数量,而对32位数量的操作则需要额外的操作。 在程序坚持使用32位整数的世界中,这样的架构将处于劣势,这是另一种说C#成为未来和所有语言的方式,从本质上防止了硬件设计者提出这样的问题未来的架构。
StackOverflow不鼓励推测答案,所以请仅在您的信息来自可靠来源时回答。 我注意到SO的一些成员是微软的内部人士,所以我希望他们可以在这个问题上启发我们。
注1:其实我读过所有的答案和SO的所有评论:假设在C#中int总是32位是否安全? 但没有发现我在这个问题上为什么要问的暗示。
注2:关于SO的这个问题的可行性在这里进行了讨论(不确定地):Meta:我可以问一个“他们为什么这样做”类型的问题?
我相信他们的主要原因是针对CLR的程序的可移植性。 如果他们允许像int
这样的基本类型取决于平台,那么为CLR制作便携式程序将变得更加困难。 在平台中立的C / C ++代码中扩展typedef
-ed整型以覆盖内置int
的使用,这是间接暗示CLR的设计者为什么决定让内置类型与平台无关。 像这样的差异是基于虚拟机的执行系统的“一次编写,随处运行”目标的一个很大的抑制因素。
编辑通常情况下, 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倍的字节数作为需要编组的字节数使用4代替sizeof(int)
。 而且,这个技术上不正确的代码将保持便携!
最终,像这样的小事件在平台的认知中“很好”或“不好”的情况下会大打折扣。 .NET程序的用户并不关心程序崩溃,因为程序员犯了一个不可移植的错误,或者CLR是错误的。 这类似于早期Windows由于司机质量差而被广泛认为是非稳定的。 对于大多数用户来说,崩溃只是另一个.NET程序崩溃,而不是程序员的问题。 因此,对于“.NET生态系统”的理解对于使标准尽可能宽容是有益的。
许多程序员倾向于为他们使用的平台编写代码。 这包括关于类型大小的假设。 如果int的大小被改为16或64位,因为它们是在假设int为32位的情况下写入的,所以有很多C程序会失败。 通过简单地将其定义为C#,C#的选择避免了这个问题。 如果将int定义为变量,则取决于您回到相同问题的平台。 虽然你可能会争辩说这是程序员犯错误假设的错误,但它使得语言更健壮(IMO)。 而对于桌面平台来说,32位int可能是最常见的事件。 除此之外,它使得将C本地代码移植到C#更容易一些。
编辑 :我认为你编写的代码会比你想像的更频繁地对(某种类型的sizer)做出(隐含的)假设。 基本上任何涉及序列化的东西(比如.NET远程处理,WCF,将数据序列化到磁盘等)都会给你带来麻烦,如果你允许int的变量大小,除非程序员通过使用像int32
这样的特定大小的类型来处理它。 然后你最终得到“我们总是会使用int32以防万一”,并且你什么也得不到。