我不明白......
为什么他们需要共同基础?
答案 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上阅读更多内容:
答案 8 :(得分:0)
作为对其他“答案”的旁注,结构是一种值类型,也是从对象继承的。
也许答案是它假设我们编程面向对象的风格/范式?球是一个物体。剑是一个对象。员工是一个对象。采购订单是一个对象。
有些公司将其.NET(或Java或Ruby或PHP)应用程序设计为从公共基类继承,以便在系统中对它们进行相同的处理。如果我在旧的Java时代正确地记得......所有EJB共享相同的基类,以便可以统一管理和识别它们。