.NET我们有原始数据类型,如int和值类型,如struct。
我们也有参考类型。所有这些似乎都来自对象类。
.NET如何根据引用类型确定原语,值类型?
它在哪里完成?在编译器或JIT?
这是否属于编译器的功能?
答案 0 :(得分:11)
所有值类型,包括内置公共类型系统(CTS)原语,都直接从CTS类型“System.ValueType”(枚举除外)派生。
因此编译器可以通过检查任何类型的基类型来判断。如果是“System.ValueType”,则它是值类型,否则,它是引用类型。
编辑:枚举,如
public Enum Shipper {FedEx, Aerborne, USPS, Stork}
...不直接从System.ValueType派生,它们派生自System.Enum,派生自System.ValueType ......
答案 1 :(得分:2)
值类型实际上是从System.ValueType派生的,{{3}}本身是从System.Object派生的。
答案 2 :(得分:2)
值类型派生自System.ValueType
,除其他外,它提供GetHashCode
和Equals
的默认(但缓慢)实现。 (它们很慢,因为它们使用反射)。
int
之类的原始类型可以使用box
指令装入IL中的值类型。他们有特殊的IL指令与他们合作。
引用类型是所有其他类。
还有一些指针,可以在unsafe
代码中使用,而不是从object
派生。 编辑 - proof。