.NET如何区分引用与原始和值类型

时间:2009-08-31 18:09:40

标签: .net compiler-construction

.NET我们有原始数据类型,如int和值类型,如struct。

我们也有参考类型。所有这些似乎都来自对象类。

.NET如何根据引用类型确定原语,值类型?

它在哪里完成?在编译器或JIT?

这是否属于编译器的功能?

3 个答案:

答案 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,除其他外,它提供GetHashCodeEquals的默认(但缓慢)实现。 (它们很慢,因为它们使用反射)。

int之类的原始类型可以使用box指令装入IL中的值类型。他们有特殊的IL指令与他们合作。

引用类型是所有其他类。

还有一些指针,可以在unsafe代码中使用,而不是从object派生。 编辑 - proof