2011-12-13 60 views
7

我正确地认为任何对象没有从System.ValueType继承必须因此定义为引用类型?是否所有不从System.ValueType引用类型继承的对象?

我一直无法找到任何确凿的文件来备份这个概念。

+2

请看这里:http:// stackoverflow。com/questions/3503568/system-valueetype-understanding –

+2

指针既不是。不能称他们为对象。 –

+1

@HansPassant你可能故意钝,并说他们是另一种意义上的对象(例如,它们会被称为C中的对象)。尽管如此,你必须非常刻意地说,它们并不是.NET世界中的“对象”。 –

回答

6

检查this是否有帮助。

enter image description here

+2

'System.ValueType'也从'System.Object'继承。因此,通过这种逻辑,所有的值类型都是引用类型。 –

+0

(上述评论在AkharRoop编辑后包含图形后不再有效。) –

1

如果你仔细阅读Remarks你会看到

数据类型分为值类型和引用类型。值 类型是堆栈分配或内联分配在结构中。 引用类型是堆分配的。参考和值类型都是从最终基类Object派生的 。 如果值类型的行为类似于对象所必需的 ,则 使值类型看起来像引用对象的包装将分配到 堆上,并将值类型的值复制到其中。标记为 ,系统知道它包含值类型。这个过程 被称为拳击,相反的过程被称为拆箱。 装箱和拆箱允许任何类型被视为一个对象。

C#编译器做了出色的工作,让你觉得值类型,如intlong有方法

+9

他们确实有方法。这不是幻觉。 –

+0

@Eric虽然编译器做了一个可爱的工作,帮助抖动有效地代表我们,由于受限操作码的帮助,它们可以很好地调用它们;) – ShuggyCoUk

+0

@Eric Lippert:如果我有一个结构体(例如'System.Collections.Generic.List'1 + Enumerator [System.Int32]')并调用盒装实例的方法(例如'IEnumerable '.MoveNext()),系统是否直接调用与调用结构体上的方法相同的方法,调用别的东西?它似乎没有解开实例,因为函数执行的变化会影响盒装实例。我对这种行为的解释是,有一个包装函数调用装箱对象上的请求函数。这是事情的工作原理吗? – supercat

0

如果你是在QI和史蒂芬·弗莱在做的是什么易受影响的白痴自以为聪明的人他的正常的事情是这样的,那么他会对“任何不从System.ValueType继承的对象因此必须根据定义成为引用类型”来做出反应,并使用klaxon和闪烁的屏幕显示“所有对象都是值类型或引用类型”。

然后,他会继续指出,最初在计算机科学中,对象表示任何可以被计算机操纵的实体,因此包括指针,即使它们不具有指针符合对象的后续定义(后面的表示带有某种屈尊的色调),它指的是用他们的方法封装的对象,因此你错了。

艾伦戴维斯会指出,每个人都知道你的意思,但已经太晚了,你的发言只会助长弗莱温和的自鸣得意,尤其是因为技术可能仅次于奥斯卡王尔德队伍他喜欢认为自己可以聪明地谈论(也许在他一无所知的事物队伍中是首屈一指的,现在我想起来,他无法设法说出上述内容,也没有错某种方式)。

换句话说,是的,你是完全正确:)

(对不住那些谁没见过什么英国的电视,因此没有什么线索任何这意味着)。

+0

当QI出现时,我倾向于翻身;-) –

+0

明智的选择。不幸的是,我的孩子往往不会,所以我只是指出错误和“正确”的答案,只是玩语义。 –

相关问题