【发布时间】:2015-06-03 04:05:28
【问题描述】:
在 msdn 规范中,我注意到 System.Object 是 .Net 中的终极基类。
他们说System.ValueType 是一个继承自System.Object 的抽象类,并覆盖了Equals、Compare 等方法...
bool、int 等值类型继承自 System.ValueType,所有其他 .net 对象都继承自 System.Object。
我对此有 2 个问题。
- System.Object 需要什么?为什么这里没有首选界面?
我假设它只有 2 个直接子项(忽略我们可以创建更多),即 System.ValueType 和 System.ReferenceType 都具有完全不同的实现。
**编辑:**没有 System.ReferenceType。只有 Sytem.Object 和 Sytem.ValueType (覆盖基类)。
在这里道歉。
所以可能需要 System.Object 来处理基本的 CLR 功能,例如使用 new() 创建对象、强制执行默认构造函数、GC 等?
- 当我反编译
Sytemdll 并看到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 堆上已释放对象的占位符。您找到的值类型的结构声明仅与值的装箱版本匹配,它们的非装箱表示非常不同并且与处理器密切相关。