为什么C#将整数类型实现为结构体而不是原始类型?

7

在研究C#中如何将int类型实现为System.Int32结构体时,我想知道为什么要这样实现(通过将其包装到结构体类型中),而没有选择像Java中那样采用原始类型实现?

包装到结构体中是否会产生额外的性能损失?


是的,但它被实现为结构类型。我的问题是为什么.NET没有直接支持真正的本地“原始”类型? - Tamas Ionut
可能是如何非递归地定义“原始”类型?的重复问题。 - M.kazem Akhgary
为了方便:你可以写成 List<int> list123.ToString(); 等等。奥卡姆剃刀原则:整数是一个类,而不是特殊的“原始类型”。 - Dmitry Bychenko
C#将所有数据类型视为具有自己方法的类或结构体。 - hecate
1个回答

8
这里没有对struct进行任何“包装”。实际上,System.Int32 struct可以被认为是内置的原始类型,因为编译器识别它们并在处理原始类型表达式时生成特殊指令。唯一需要包装一个int(或其他任何struct)的地方是在装箱转换期间,当您想要将int传递给接受对象的API时,这是必需的。
Java和C#处理原始类型的最大区别在于,您可以在C#泛型参数中使用原始类型,而Java将原始类型视为完全不同的类型组。

3
@TamasIonut说:“没有‘wrapping’(包装)”。我猜你指的是将int进行boxing/unboxing所产生的开销。但只有在将int强制转换成object时才会发生这种情况。 - Tim Schmelter
1
那个结构体与您创建的普通结构体不同。您不能像创建 int 那样创建这样的结构体,其中包含 int 字段。那是特殊情况。@TamasIonut - M.kazem Akhgary
2
我明白了。所以,它是一种特殊类型的结构,在CLR中处理。 - Tamas Ionut
2
@TamasIonut 这个"更多开销"的事情并没有发生——struct只是所有值类型的通用名称,包括原始类型。编译器对于原始类型知道足够多的信息,当它们出现时就会生成不同的CLR代码,而不是用户定义的struct。例如,编译器充分利用了内置类型的CIL支持。 - Sergey Kalinichenko
1
@M.kazemAkhgary int 唯一特殊的地方就是编译时有字面量支持。除此之外,你可以将其实现为用户定义的 struct。字面常量是唯一具有特殊编译器支持的内容。 - Servy
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接