C#System.Object是最终的基类

时间:2015-06-02 18:10:17

标签: c# clr cts cls

在msdn规范中,我注意到System.Object是.Net中的最终基类。 他们说System.ValueType是一个继承自System.Object的抽象类,并且会覆盖EqualsCompare等方法。 像boolint等值类型继承自System.ValueType所有其他.net对象都继承自System.Object

我有两个问题。

  1. System.Object有什么需要?为什么这个界面不是首选?
  2. 假设它只有2个直接子节点(忽略我们可以创建更多),即System.ValueType和System.ReferenceType都具有完全不同的实现。

    **编辑:**没有System.ReferenceType。只有Sytem.Object和Sytem.ValueType(覆盖基类)。 在此道歉。

    所以可能需要System.Object来处理基本的CLR功能,比如使用new()创建对象,强制执行默认构造函数,GC等?

    1. 当我解编译Sytem dll,并看到bool的实现时,我只看到一个结构。
      对于一个类(比如Exception)我没有看到继承到系统.ReferenceType或System.Object。这个继承是如何处理的?
      事实上,Common {{{{}}对MyCustomClass做什么是公共类型系统继承System.Object(因为继承是在编译时确定的,我认为CTS正在这样做)。
    2. 如果我的理解错误,请随时纠正我/编辑帖子。

      enter image description here

1 个答案:

答案 0 :(得分:10)

这个问题你有很多疑问。将来,请考虑在每个问题上发布一个问题。

  

System.Object有什么需要?

问题很模糊。让我重新说一下。

  

为什么C#类型系统的设计使所有非指针类型都有一个共同的基类型?

获得多态性的好处。在没有泛型的类型系统中,如C#1.0类型系统,您希望能够创建任意对象的列表。

  

为什么界面不是类型的首选?

接口指定功能。基类允许共享实现。 Object上的方法具有在派生类型之间共享的实现。

  

假设它只有2个直接子节点(忽略我们可以创建更多),即System.ValueType和System.ReferenceType都具有完全不同的实现。

这完全是假的。

  

因此可能需要System.Object来处理基本的CLR功能,例如使用new()

创建对象

没有

  

强制执行默认构造函数

没有。尽管最终调用了对象的默认构造函数,但该构造函数并没有做任何事情。所以说这种类型的目的是确保一个没有做任何事情的构造函数被调用是一件很奇怪的事情。

  

GC等?<​​/ p>

没有

  

当我解编译System.dll,并看到bool的实现时,我只看到一个结构。

正确。您应该知道所有不可为空的非枚举结构都直接从System.ValueType继承。

  

对于一个类(比如Exception),我没有看到System.ReferenceType或System.Object的继承。

正确。您应该知道所有类类型都继承自System.Object(如果没有指定其他类型,当然。)

  

这个继承是如何处理的?

这个问题太模糊了,无法回答。

  

什么是Common Type System对MyCustomClass做什么使它继承System.Object(因为继承是在编译时确定的,我认为CTS正在这样做)

我完全不知道你在这里问的是什么。尝试使问题更精确。

你没有问过但可能应该问的问题是:

  

当我说类型A继承自类型B时,它是什么意思?

这意味着B类的所有成员也是A类的成员。

  

所有会员?甚至是私人会员?

是。继承是一种类型的成员也是另一种类型的成员的属性。