【问题标题】:How .NET differentiates reference vs primitive and value types.NET 如何区分引用类型、原始类型和值类型
【发布时间】:2009-08-31 18:09:39
【问题描述】:

.NET 我们有像 int 这样的原始数据类型和像 struct 这样的值类型。

而且我们还有引用类型。它们似乎都是从对象类派生的。

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

它是在哪里完成的?在编译器还是在 JIT?

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

【问题讨论】:

  • 对不起,我不太明白你的问题。

标签: .net compiler-construction


【解决方案1】:

所有值类型,包括内置的通用类型系统 (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,尽管这个测试的内部实现可以比这更有效地执行。
  • @280Z28:我不确定这意味着什么,因为 System.Enum 不是您可以直接使用的类型。事实上,它甚至不足以用作泛型类型的约束(参见msdn.microsoft.com/en-us/library/d5x73970.aspx 的底部)。
  • @280Z28 Please calrify 'System.Enum 除外,它派生自 System.ValueType 但本身不是值类型。'
  • @280Z28。枚举是一个例外,因为它们必须从 System.Enum 派生,它只是整数类型(short、int、long 等)的特化,不会向整数类型添加任何新字段,而只是限制值允许的空间。任何枚举类型都必须指定第二种类型,该类型将用作核心整数类型,以保存数据表示。当然,第二个核心整数类型派生自 System.ValueType。是的,枚举是值类型。
  • 枚举也不例外,因为 System.Enum 派生自 System.ValueType,因此相同的类型检查将事件应用于它们。
【解决方案2】:

值类型实际上是从System.ValueType 派生的,而System.ValueType 本身是从 System.Object 派生的。

【讨论】:

    【解决方案3】:

    值类型派生自System.ValueType,除其他外,它提供了GetHashCodeEquals 的默认(但缓慢)实现。 (它们很慢,因为它们使用反射)。

    int 这样的原始类型可以使用box 指令在IL 中装箱成值类型。他们有特殊的 IL 指令可以使用它们。

    引用类型是所有其他类。

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

    【讨论】:

    • 是的,它们完全不相关。一方面,IntPtr 是一个结构,你不能从结构派生。
    猜你喜欢
    • 2012-02-06
    • 2012-07-20
    • 1970-01-01
    • 2011-07-09
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多