【问题标题】:CLR Type SystemCLR 类型系统
【发布时间】:2020-06-16 23:24:29
【问题描述】:

我在阅读“CLR via C#”一书(类型基础章节)时感到困惑,其中说某些基本类型对象(例如 class Employee { })的类型对象是 System.Type 和另外,GetType 方法实际上返回一个指向对象类型对象的指针(它提供类型继承),所以听起来 System.Type 是所有类型对象引用的最基本类型对象(并且 System.Type 类型指针引用自身)。但另一方面,所有类型都继承自 System.Object,例如,此表达式 typeof(Employee).BaseType 返回 System.Object(不是 System.Type!)。 那么任何人都可以解释类型对象指针实际指的是哪里吗? System.Type 还是 System.Object?

          System.Object
           /         \ 
      Employee     System.Reflection.MemberInfo
                               \
                           System.Type

编辑

感谢提供答案的JonasH。我还绘制了有助于我直观理解的方案:

【问题讨论】:

标签: c# inheritance types clr


【解决方案1】:

某个基类型对象(例如 class Employee { })的类型对象是 System.Type

这是真的,但有点令人困惑,any对象的类型对象是System.Type。

GetType 方法实际上返回一个指向对象类型对象的指针

也是如此。我们称它为引用而不是指针,但这是技术性问题。

所以听起来 System.Type 是所有类型对象都引用的最基本的类型对象。

这不遵循前面的陈述。 System.Object 是所有其他对象派生自的最基本对象。 System.Type 与任何其他对象一样是一个对象,因此它派生自 System.Object。和你的插图一样。

这样的讨论会变得有点混乱。区分对象类型(即Employee)和所述对象的类型对象(即System.Type)是至关重要的。

从语言设计的角度考虑。拥有一个所有对象都派生自的基本类型,允许程序员在需要时回避类型系统,并拥有一些基本方法,如 ToString 和 GetHashcode,这很有用。让程序员检查并直接使用语言的类型系统也很有用。我们称之为“反射”。 System.Type 是这个系统的一部分,它描述了对象的类型信息。但它就像任何其他类型一样,因此需要从 System.Object 派生。

【讨论】:

  • 谢谢你的回答,但为什么是Employee -> Type而不是Employee -> Object -> Type
  • 我想你误会了。 Employee 派生自 Object,即Employee -> Object。它们每个都有一个关联的类型对象,即typeof(Employee)typeof(Object)
【解决方案2】:

Delegate

Type 类的属性 BaseType 返回该类型继承的类。因此,对于 System.Delegate,BaseType 将是 System.Object 类型,因为如果您阅读 System.Delegate 的文档,它直接继承自 System.Object。 C# 中的每个类都继承自 System.Object,即使不是直接继承。

从上面的链接可以看出,System.Delegate 实现了 ICloneable、System.Runtime.Serialization.ISerializable。最后两个是接口,因此它们不算作扩展类。因此,隐含地,它直接继承 System.Object。

【讨论】:

  • 谢谢你的回答,但这与我的问题无关,所以我只是编辑了我的问题描述以更清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多