在C#中,为什么"int"是System.Int32的别名?

Mik*_*kis 40 c# alias types language-design

由于C#支持Int8,Int16,Int32Int64,为什么语言的设计者选择定义int的别名,Int32而不是允许其根据是什么原生架构认为是一个变化的word

我没有特别需要int表现出不同于它的方式,我只是要求纯粹的百科全书兴趣.

我认为,一个64位RISC架构可以想见,存在这将最有效地只支持64位的数量,并在其中的32位数量操作将需要额外的操作.在程序坚持使用32位整数的世界中,这样的架构将处于不利地位,这是另一种说C#成为未来语言的方式,这实际上阻止了硬件设计者提出这样的问题.未来的建筑.

StackOverflow不鼓励推测答案,所以请仅在您的信息来自可靠来源时回答.我注意到SO的一些成员是微软内部人士,所以我希望他们能够在这个问题上启发我们.

注1:我确实阅读了所有答案和SO的所有注释:假设int在C#中总是32位是否安全?但是没有找到关于我在这个问题上提出的原因的任何暗示.

注2:这个问题的可行性上也是如此(不了了之了)这里讨论:元:我能问一个"为什么他们做这种方式"类型的问题?

das*_*ght 33

我认为他们的主要原因是针对CLR的程序的可移植性.如果他们允许基本类型与int平台相关,那么为CLR制作便携式程序将变得更加困难.typedef平台中立的C/C++代码中的-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);
}
Run Code Online (Sandbox Code Playgroud)

此代码计算并处理20个项目的所有组合.正如您所知,代码在16位系统上失败int,但在32位或64位的整数下工作正常.

不安全的代码会提供另一个令人头痛的问题:当它int被固定在某个大小(比方说32)的代码时,它会分配4倍的字节数,因为它需要编组的整数就可以工作,即使它在技术上不正确用4代替sizeof(int).此外,这种技术上不正确的代码将保持可移植性!

最终,像这样的小事情在很大程度上将平台视为"好"或"坏"..NET程序的用户并不关心程序崩溃,因为程序员犯了一个非便携式错误,或者CLR是错误的.这类似于早期Windows由于驱动程序质量差而被广泛认为不稳定的方式.对于大多数用户来说,崩溃只是另一个.NET程序崩溃,而不是程序员的问题.因此,有利于感知".NET生态系统",使标准尽可能宽容.

  • 我应该更清楚.`int`通常是许多开发人员使用的默认数据类型.开发人员没记住它*可能*加倍到64位不会受到伤害(如你所说).没记住它*可以*减半到32位IS危险. (5认同)

Chr*_*Wue 6

许多程序员倾向于为他们使用的平台编写代码.这包括关于类型大小的假设.如果将int的大小更改为16位或64位,则会有许多C程序失败,因为它们是在假设int为32位的情况下编写的.C#的选择通过简单地定义它来避免这个问题.如果你根据平台将int定义为变量,则可以回到同一个问题.虽然你可能会认为这是程序员做出错误假设的错误,但它会使语言更加健壮(IMO).对于桌面平台,32位int可能是最常见的事件.此外,它使本地C代码移植到C#更容易一些.

编辑:我认为你编写的代码比你想象的更频繁地对类型的sizer做出(隐式)假设.基本上任何涉及序列化的东西(如.NET远程处理,WCF,将数据序列化到磁盘等)都会让你遇到麻烦,如果你允许int的变量大小,除非程序员通过使用特定大小的类型来处理它int32.然后你最终得到"我们将始终使用int32以防万一"并且你什么都没得到.