【问题标题】:C# System.Object being the ultimate base classC# System.Object 是最终的基类
【发布时间】:2015-06-03 04:05:28
【问题描述】:

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

我对此有 2 个问题。

  1. System.Object 需要什么?为什么这里没有首选界面?

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

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

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

  1. 当我反编译Sytem dll 并看到bool 的实现时,我只看到一个结构。
    对于一个类(比如异常),我看不到对System.ReferenceType 或System 的继承。目的。这种继承是如何处理的?
    事实上,Common Type System 对 MyCustomClass 做了什么以使其继承自 System.Object(因为继承是在编译时确定的,我认为 CTS 正在这样做)

如果我的理解有误,请随时纠正我/编辑帖子。

【问题讨论】:

  • 没有System.ReferenceType 类,所以我不知道你从哪里得到的。
  • 所有结构都隐式继承自 System.ValueType,这就是为什么您在反编译的 C# 中看不到它的原因。看看 IL,它就在那里。
  • @Servy:哎呀..这是我的错误..我编辑了帖子
  • 为什么这里没有首选接口? 因为System.Object 实现了某些东西。 Interfaces 实际上无法实现任何东西。 您注意到当您声明一个类时,您不需要指定.Equals 的实现?因为System.Object 已经提供了一个。如果C# 让我为所有内容指定我自己的.Equals 方法(因为interface 的选择不当)我会设计我自己的abstract class 让所有内容都可以继承,那已经提供了这样的东西。
  • 接口是契约,在它们真正实现之前只是稀松平常。 System.Object 是结构化的,它在 CLR 中起着重要的作用。对象标头很重要,这是所有 .NET 类型的共同点。还用作 GC 堆上已释放对象的占位符。您找到的值类型的结构声明仅与值的装箱版本匹配,它们的非装箱表示非常不同并且与处理器密切相关。

标签: c# clr cts cls


【解决方案1】:

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

System.Object 需要什么?

这个问题很模糊。让我改一下。

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

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

为什么不首选接口而不是类类型?

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

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

这完全是错误的。

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

没有。

强制执行默认构造函数

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

GC 等?

没有。

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

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

对于一个类(比如异常),我看不到对 System.ReferenceType 或 System.Object 的继承。

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

如何处理这种继承?

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

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

我完全不知道你想在这里问什么。试着让问题更准确。

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

我说类型 A 继承自类型 B 是什么意思?

表示所有类型B的成员也是类型A的成员。

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

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

【讨论】:

  • 如果我猜到最后一个 actual 问题的目的,我认为 OP 的意思是“编译器/JIT/CTS/CLR 如何/何时/在哪里定义我的如果我没有指定不同的基类,类继承自object
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多