值类型继承自 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)和属性中受益。此外,通过这种方式,您可以像对待其他引用类型一样对待值类型——没有什么能阻止您在 Object
s 的数组中插入 int
。
【讨论】:
【参考方案2】:问问自己,为什么通常分配在堆栈上的类型会继承自 System.Object
,这很奇怪,我想你会发现你无法提出一个好的理由。
如果你认为这是因为一个对象的 type 定义了它的分配位置,那你就错了。 ValueType
的哪个成员负责定义其分配机制? (System.Object
的哪个成员?)
.NET 中的类型继承应该包含“is a”关系:例如 string
is an object
。 .NET 世界中的一切都是object
,所以int
是object
,double
是object
,等等。
您可以根据Liskov substitution principle 来考虑这一点:如果我编写的代码需要object
,我应该能够处理任何 是的类型强> 一个object
——即,任何东西。我的代码应该同样适合string
、int
、List<int>
等。
另请注意,object
保证所有类型因此而具有的某些成员:GetType
、ToString
和 GetHashCode
。
【讨论】:
-1 这是一个非常糟糕的答案。它没有任何解释。此外,“is-a”关系并不意味着它必须派生自同一个类。同样,“对象”并不意味着它必须派生自System.Object
类。它可能不是从任何东西派生的,但仍然可以是一个对象。为什么ValueType
派生自Object
的问题基本上是语义 或类型类别的问题:值类型与引用类型。
@Nawaz 不正确。指针不是从 Object 派生的,因此它们不是对象。
值类型通常分配在堆栈上是一个著名的 C# 神话。
@RBT:它们不是在栈上分配的吗?
没有。 大多数时间值类型只进入堆。只有当它们是方法内的局部变量时,它们才会被分配到堆栈上。请查看 Jon Skeet 的著名博客 this,这将使您从各个方面一目了然。以上是关于值类型继承自 System.Object...为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章