值类型(整数,十进制,布尔等)是否继承自Object?

时间:2009-11-24 22:25:32

标签: .net

寻求澄清......

我听说.Net中的'一切'都是从Object继承的。我也听说过值类型和引用类型之间的区别在于引用类型继承自Object和值类型不会。

我的理解是一切都是一个对象(继承自System.Object);但是价值类型和参考类型只是彼此“不同”。值类型在堆栈上分配,引用类型在堆栈上放置一个“指针”,指向堆上的地址。

这是它的要点吗?什么使Integer成为值类型?那是语言固有的东西吗?

8 个答案:

答案 0 :(得分:17)

值类型,例如Int32,是结构。

从VS 2008 C#帮助文件(因为我打开它)结构:

  

结构不能从另一个结构或类继承,也不能作为类的基础。所有结构都直接从System.ValueType继承,该继承自System.Object。

答案 1 :(得分:14)

这取决于您查看术语的方式 - 这取决于您是在谈论C#还是CLI规范。例如,在CLI规范(ECMA-355)第8.9.8节和第8.9.10节中说明:

  

值类型不会继承,但是   关联的盒装类型是一个对象   类型因此继承自其他   类型。

  

在未装箱的表格中,值类型可以   不从任何类型继承。盒装价值   类型应直接继承   System.ValueType除非他们是   枚举,在这种情况下,他们   应继承自System.Enum。盒装   价值类型应密封。

因此,从CLI的角度来看,问题的答案是

但是,让我们看看C#规范 - 因为我们处于类似ECMA的情绪中,让我们选择那个版本(目前停留在C#2)。第11.1.1节规定:

  

所有值类型都隐式继承   来自班级System.ValueType,   反过来,它继承自阶级   object

所以从C#规范的角度来看,答案是

有人可能会说你标记了你的问题“.net”,所以我们应该使用CLI定义;如果您将其标记为“c#”,我们应该使用C#定义。看看它是多么武断? :)

所有这些规范潜水并没有太多实际目的。答案取决于定义的复杂性。在重要的情况下构建一些有趣的情况更为明智......那么你想做什么?如果您可以提供一些代码,我们可以回答有关将会发生什么的问题 - 这比定义更重要。

(是的,这对我来说很不寻常 - 一般来说,术语对我来说很重要。但是,在某些情况下,细微之处更多的是诅咒而不是祝福。)

答案 2 :(得分:5)

根据Red Gate's .NET Reflector,他们(间接)从对象继承。

  • 对象 - > ValueType - > INT32
  • 对象 - > ValueType - >布尔
  • 对象 - > ValueType - >小数
  • 对象 - > ValueType - >字节
  • 对象 - > ValueType - >炭
  • 对象 - > ValueType - > UINT32

我还没有检查过其他类型,但看起来确实如此。我强烈建议使用Reflector - 它是免费下载的,它将帮助您回答有关.NET框架的各个部分如何编码的无数其他问题。有些日子我想知道没有它我会如何生活。

Reflector的最大优点是你不需要依赖某人可能过时(或不正确或解释不当)的写作来发现.NET Framework中真正的内容 - 包括在MSDN上 - 即使是全能的微软也绝对不可靠。该文档仅与其上次修改一样最新。直接从代码中获得答案是最不可能的 - 当然假设你能够正确地插入代码;)

答案 3 :(得分:4)

值类型从对象

继承(间接)

...但是not everything in .net inherits from object

答案 4 :(得分:3)

值类型也从Object继承,但不是直接继承。它们继承自ValueType,后者继承Object

答案 5 :(得分:3)

是的,值类型确实从Object继承。

请参阅此处的继承层次结构部分:http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

同一页面中的备注部分字面上说:

  

引用和值类型都是   源自最终基类   对象

答案 6 :(得分:2)

简而言之,并非所有内容都来自object,也有例外。 Eric Lippert的这篇博文可能是关于这个主题的最佳参考:"Not everything derives from object"

所有struct隐式派生自System.ValueType

值类型和引用类型之间的区别是一个语义问题:值类型表现出值语义,而引用类型表现出值语义。实施细节(例如分配的位置等)并不重要。

例如,

int是值类型,因为它们是struct。当然,我们将int s建模为值类型,因为它们代表值,我们需要值语义,而不是引用语义。

答案 7 :(得分:2)

来自MSDN的

:( http://msdn.microsoft.com/en-us/library/s1ax56ch%28VS.71%29.aspx

价值类型

值类型包含两个主要类别:

* Struct type
* Enumeration type

结构类型包含用户定义的结构类型和以下内置的简单类型:

* Numeric types
      o Integral types
      o Floating-point types
      o decimal
* bool

价值类型的主要特征

值类型的变量始终包含该类型的值。对值类型变量的赋值会创建指定值的副本,而对引用类型变量的赋值会创建引用的副本,但不会创建引用对象的副本。

所有值类型都是从Object类隐式派生的。

与引用类型不同,无法从值类型派生新类型。但是,与引用类型一样,结构可以实现接口。

与引用类型不同,值类型不可能包含空值。

每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。有关值类型的默认值的信息,请参阅默认值表。

简单类型的主要特征

所有简单类型都是.NET Framework系统类型的别名。例如,int是System.Int32的别名。有关别名的完整列表,请参阅内置类型表。

在编译时计算常量表达式,其操作数都是简单类型常量。有关更多信息,请参见7.15常量表达式。

可以使用文字初始化简单类型。例如,'A'是char类型的文字,2001是int类型的文字。