为什么在 .Net 中每个类都派生自 System.Object?这有哪些好处?

8
为什么.Net中的每个类都是从System.Object派生而来?这样做有什么好处呢?

1
需要让垃圾回收器工作。 - Hans Passant
4个回答

5
我向您提出相反的问题:为什么不呢?如果没有一些共同的祖先,您将如何引用“任何类型的某个对象”?有时候这是必要的。不过,System.Object 类确实有一些对于任何类型都有用的有用方法:
  • Equals 用于测试相等性
  • GetHashCode 用于集合中的性能
  • GetType - 所有对象都有某种类型
  • Finalize 支持CLR终结
由于这些东西对所有类型都是共同的,您可以编写代码(即使在泛型之前)来智能地处理多个类型。
话虽如此,在C#4.0中,它们引入了dynamic,它实际上是自己的类层次结构。它完全绕过静态类型检查,并不一定派生自object。MSDN有一篇好文章讲解它,而Chris Burrows的博客系列也很有趣。

1
如果所有东西都源自一个单一的类,那么你可以拥有通用的行为,比如“is”、“as”、ToString()和GetHashCode()。你可以在任何变量上使用这些运算符/方法。
你还可以将任何东西泛型地传递为一个“对象”,这比使用空指针要好得多。

1
即使在dotnet系统中,有些类也从空接口派生出来以进行转换,同时进行进度操作。 - dankyy1

0
在托管的世界中,您牺牲了指针的使用,但您有引用。因此,虽然您不能拥有像这样的东西:
SomeClass obj = new SomeClass();
void* pObj = &obj;

你可以通过继承来使用引用类型(以及通过装箱使用值类型,但那并不是完全相同的东西)作为参考:

object pObj = obj;

当然还有其他好处,但我主要看到过将object用作空指针的替代品。


0

没有这种行为:

  • 使用Equals()方法比较不同类的对象几乎是不可能的。
  • 您将无法将类的实例存储在标准(非泛型)集合中。
  • 您将无法依赖于隐式转换为String类型。

此外,如果我没记错的话,.NET的整个内存管理模型都围绕System.Object类型展开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接