为什么.NET中的每个类都继承自Object?

时间:2009-10-17 23:23:50

标签: c# object

我不明白......

为什么他们需要共同基础?

9 个答案:

答案 0 :(得分:20)

这个问题预示着虚假。他们不需要共同的基本类型。这种选择不是出于必要。它源于为客户提供最佳价值的愿望。

在设计类型系统或其他任何事情时,有时你会达到决策点 - 你必须决定X或不是X.常见基类型或无共基类型。当发生这种情况时,你要权衡X的成本和收益以确定净值,然后权衡成本和非-X的好处来确定净值,然后你选择价值更高的那个。拥有共同基础类型的好处超过成本,因此产生的净收益大于没有共同基础类型的净收益。所以我们选择一个共同的基本类型。

这是一个非常含糊的答案。如果您想要更具体的答案,请尝试提出更具体的问题。

答案 1 :(得分:17)

我认为,主要是为了有一个类型来引用任何对象。类型object的参数可以是基本类型,结构,引用类型,只是任何东西。拥有这样的类型非常重要。

然后有一些常见的成员由每种类型实现,如Equals,ToString,GetHashCode。这确实可以是一个通用的接口,但是你不会继承默认的实现。

答案 2 :(得分:3)

因为它位于spec

  

8.9.9对象类型继承
  随着   唯一的例外是System.Object,它   不会从任何其他对象继承   类型,所有对象类型都应该   明确地或隐含地声明   支持(即继承自)   恰好是另一种对象类型。该   继承关系图应该是   形成一棵单根的树   基础的System.Object;即所有   对象类型最终继承自   类型System.Object。

这种设计方法有几个benefits

答案 3 :(得分:2)

许多/大多数的一些原因是:

提供常见成员,例如Equals,Finalize,GetHashCode,ToString ....

帮助拳击......

答案 4 :(得分:1)

Java和C#对此采取了不同的方法。这主要与表现有关。

如果您想象每个对象都可以为空,那么它必须是指向值的指针,该值可以更改为指向null的指针。现在这意味着对于每个对象,至少需要一个指针和一块内存来存储值。

Java具有原始值的概念,它不是对象。它没有指针,也不可为空。这打破了OOP范式,但表现明智是有道理的。

C#(或者更准确地说是CLR + BCL)尝试了一个很好的折衷方案,即ReferenceType和ValueType派生。从ValueType派生的任何内容都被视为CLR的原语,从而避免使用对象引用。但是,通过装箱,这个值仍然可以像对象一样对待,允许您获得原始类型的性能优势,但允许将所有内容视为对象。

这些事物之间真正的关键区别在于将参数传递给方法的语义。如果一切都是对象,那么您将传递对象的引用,即可以通过将对象传递给方法来更改对象。基元和C#值类型按值传递,因此它们被有效地复制到方法调用中,原始值不变。

这是发展的标准故事。首先尝试正确,然后看看是否可以在看到瓶颈后再对其进行优化。通过值语义也可以防止编码错误的可变性。 (例如,在C#中传递一个类与一个结构)

答案 5 :(得分:0)

的ToString。例如。

答案 6 :(得分:0)

对拳击和拆箱有用

请参阅reference

答案 7 :(得分:0)

.NET中的每个对象都共享公共属性和方法。但是,这些分为两类:值类型和引用类型。值类型(即int)存储在堆栈中,引用类型(即您的自定义类)存储在堆上。引用类型存储对实际数据(堆上的数据)的引用。值类型直接包含其数据。

您可以在MSDN上阅读更多内容:

http://msdn.microsoft.com/en-us/library/system.object.aspx

答案 8 :(得分:0)

作为对其他“答案”的旁注,结构是一种值类型,也是从对象继承的。

也许答案是它假设我们编程面向对象的风格/范式?球是一个物体。剑是一个对象。员工是一个对象。采购订单是一个对象。

有些公司将其.NET(或Java或Ruby或PHP)应用程序设计为从公共基类继承,以便在系统中对它们进行相同的处理。如果我在旧的Java时代正确地记得......所有EJB共享相同的基类,以便可以统一管理和识别它们。