寻求澄清......
我听说.Net中的'一切'都是从Object继承的。我也听说过值类型和引用类型之间的区别在于引用类型继承自Object和值类型不会。
我的理解是一切都是一个对象(继承自System.Object);但是价值类型和参考类型只是彼此“不同”。值类型在堆栈上分配,引用类型在堆栈上放置一个“指针”,指向堆上的地址。
这是它的要点吗?什么使Integer成为值类型?那是语言固有的东西吗?
答案 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,他们(间接)从对象继承。
我还没有检查过其他类型,但看起来确实如此。我强烈建议使用Reflector - 它是免费下载的,它将帮助您回答有关.NET框架的各个部分如何编码的无数其他问题。有些日子我想知道没有它我会如何生活。
Reflector的最大优点是你不需要依赖某人可能过时(或不正确或解释不当)的写作来发现.NET Framework中真正的内容 - 包括在MSDN上 - 即使是全能的微软也绝对不可靠。该文档仅与其上次修改一样最新。直接从代码中获得答案是最不可能的 - 当然假设你能够正确地插入代码;)
答案 3 :(得分:4)
值类型从对象
继承(间接)答案 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)
:( 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类型的文字。