【发布时间】:2009-08-31 18:09:39
【问题描述】:
.NET 我们有像 int 这样的原始数据类型和像 struct 这样的值类型。
而且我们还有引用类型。它们似乎都是从对象类派生的。
.NET 如何根据引用类型确定原始值类型?
它是在哪里完成的?在编译器还是在 JIT?
这是否属于编译器的能力?
【问题讨论】:
-
对不起,我不太明白你的问题。
标签: .net compiler-construction
.NET 我们有像 int 这样的原始数据类型和像 struct 这样的值类型。
而且我们还有引用类型。它们似乎都是从对象类派生的。
.NET 如何根据引用类型确定原始值类型?
它是在哪里完成的?在编译器还是在 JIT?
这是否属于编译器的能力?
【问题讨论】:
标签: .net compiler-construction
所有值类型,包括内置的通用类型系统 (CTS) 原语,都直接从 CTS 类型“System.ValueType”派生而来(枚举除外)。
所以编译器可以通过检查任何类型的基类型来判断。如果是“System.ValueType”,则为值类型,否则为引用类型。
编辑:枚举,如
public Enum Shipper {FedEx, Aerborne, USPS, Stork}
...不直接派生自 System.ValueType,它们派生自 System.Enum,后者派生自 System.ValueType...
【讨论】:
System.Enum 除外,它派生自 System.ValueType 但本身不是值类型。但是所有enum 类型都是 值类型,它们派生自System.Enum,使其基本类型不是System.ValueType。所以值类型是从System.ValueType 派生的类型,除了System.Enum,尽管这个测试的内部实现可以比这更有效地执行。
值类型实际上是从System.ValueType 派生的,而System.ValueType 本身是从 System.Object 派生的。
【讨论】:
值类型派生自System.ValueType,除其他外,它提供了GetHashCode 和Equals 的默认(但缓慢)实现。 (它们很慢,因为它们使用反射)。
像int 这样的原始类型可以使用box 指令在IL 中装箱成值类型。他们有特殊的 IL 指令可以使用它们。
引用类型是所有其他类。
还有指针,可以在unsafe 代码中使用,而根本不是从object 派生的。 编辑 - proof.
【讨论】:
IntPtr 是一个结构,你不能从结构派生。