为什么.Net中的每个类都派生自System.Object?有什么好处?

时间:2010-08-23 06:59:46

标签: c# .net

为什么.Net中的每个类都派生自System.Object?有什么好处?

4 个答案:

答案 0 :(得分:4)

我向你提出了相反的问题:为什么不呢?如果不是某些共同的祖先,你会如何引用“任何类型的某个对象”?有时需要。但实际上,System.Object类确实有一些有用的方法,通常对任何类型都有用:

  • Equals帮助测试平等
  • GetHashCode有助于提升馆藏效果
  • GetType - 所有对象都有某种类型
  • Finalize支持CLR最终确定

因为这些东西对所有类型都是通用的,所以你可以拥有在多种类型上智能操作的代码(甚至在泛型之前)。

尽管如此,在C#4.0中,他们已经引入了dynamic,这实际上是它自己的类层次结构。它完全绕过静态类型检查,并不一定来自object。 MSDN对此有一个good articleChris Burrows' blog series也很有趣。

答案 1 :(得分:1)

如果所有内容都来自单个类,那么您可以拥有通用的行为 - 例如“is”,“as”,ToString()和GetHashCode()。您可以在任何变量上使用这些运算符/方法。

你也可以将任何一般作为'对象'传递,这比使用void指针更好。

答案 2 :(得分:0)

没有这种行为:

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

另外,如果我没弄错的话,.NET的整个内存管理模型都围绕着System.Object类型。

答案 3 :(得分:0)

在托管世界中,你牺牲了指针的使用,但你有参考。所以虽然你不能有这样的东西:

SomeClass obj = new SomeClass();
void* pObj = &obj;

你可以将它作为参考类型(和拳击的价值类型,但那不是真的一样),这要归功于继承:

object pObj = obj;

当然还有其他好处,但我主要看到使用object代替void指针。