值类型继承自 System.Object...为啥? [复制]

Posted

技术标签:

【中文标题】值类型继承自 System.Object...为啥? [复制]【英文标题】:Value types inherit from System.Object...why? [duplicate]值类型继承自 System.Object...为什么? [复制] 【发布时间】:2011-06-11 08:59:47 【问题描述】:

可能的重复:Is everything in .NET an object?How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?

嗨, 我就是不明白。 System.Object 是(我认为)引用类型,但 .NET 中的所有数据类型都继承自它。值类型也可以。我不明白 - 值类型在堆栈上有它的值,但它继承自 Object? 希望有人能帮助我理解

【问题讨论】:

可能重复....***.com/questions/436211/… 你的类型都是我们的! 【参考方案1】:

您是正确的,虽然 Object 是一个引用类型,但值类型确实从它隐式地继承,正如 msdn 对Value Types 的引用所述(根据引用,它们在技术上继承自ValueType 类,继承自 Object。

C# 对此做了一个特例,因此值类型可以从 Object 的方法(如 ToString)和属性中受益。此外,通过这种方式,您可以像对待其他引用类型一样对待值类型——没有什么能阻止您在 Objects 的数组中插入 int

【讨论】:

【参考方案2】:

问问自己,为什么通常分配在堆栈上的类型会继承自 System.Object,这很奇怪,我想你会发现你无法提出一个好的理由。

如果你认为这是因为一个对象的 type 定义了它的分配位置,那你就错了。 ValueType 的哪个成员负责定义其分配机制? (System.Object 的哪个成员?)

.NET 中的类型继承应该包含“is a”关系:例如 string is an object.NET 世界中的一切都是object,所以intobjectdoubleobject,等等。

您可以根据Liskov substitution principle 来考虑这一点:如果我编写的代码需要object,我应该能够处理任何 是的类型强> 一个object——即,任何东西。我的代码应该同样适合stringintList<int> 等。

另请注意,object 保证所有类型因此而具有的某些成员:GetTypeToStringGetHashCode

【讨论】:

-1 这是一个非常糟糕的答案。它没有任何解释。此外,“is-a”关系并不意味着它必须派生自同一个类。同样,“对象”并不意味着它必须派生自 System.Object 类。它可能不是从任何东西派生的,但仍然可以是一个对象。为什么ValueType 派生自Object 的问题基本上是语义 或类型类别的问题:值类型与引用类型。 @Nawaz 不正确。指针不是从 Object 派生的,因此它们不是对象。 值类型通常分配在堆栈上是一个著名的 C# 神话。 @RBT:它们不是在栈上分配的吗? 没有。 大多数时间值类型只进入堆。只有当它们是方法内的局部变量时,它们才会被分配到堆栈上。请查看 Jon Skeet 的著名博客 this,这将使您从各个方面一目了然。

以上是关于值类型继承自 System.Object...为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

.NET基础拾遗类型语法基础和内存管理基础1

unity之初级必备知识

深入理解类型

接口继承自System.Object吗?

类型语法基础和内存管理基础

值类型和引用类型 区别