C# 都是不';是否从System.ValueType引用类型继承?

C# 都是不';是否从System.ValueType引用类型继承?,c#,.net,vb.net,value-type,reference-type,C#,.net,Vb.net,Value Type,Reference Type,我认为任何不从继承的对象根据定义必须是引用类型,这是正确的吗 我找不到任何确凿的文件来支持这一观点。检查是否有帮助 如果你仔细阅读,你会发现 数据类型分为值类型和引用类型。价值 类型可以是堆栈分配的,也可以是在结构中内联分配的。 引用类型是堆分配的。引用和值类型都是 派生自最终基类对象如果是 值类型的行为必须类似于对象,即 使值类型看起来像在上分配的引用对象 堆,并将值类型的值复制到其中。包装器 标记,以便系统知道它包含值类型。这个过程 称为装箱,相反的过程称为拆箱。 装箱和取消装箱允许将任何类

我认为任何不从继承的对象根据定义必须是引用类型,这是正确的吗

我找不到任何确凿的文件来支持这一观点。

检查是否有帮助

如果你仔细阅读,你会发现

数据类型分为值类型和引用类型。价值 类型可以是堆栈分配的,也可以是在结构中内联分配的。 引用类型是堆分配的。引用和值类型都是 派生自最终基类对象如果是 值类型的行为必须类似于对象,即 使值类型看起来像在上分配的引用对象 堆,并将值类型的值复制到其中。包装器 标记,以便系统知道它包含值类型。这个过程 称为装箱,相反的过程称为拆箱。 装箱和取消装箱允许将任何类型视为对象


C#编译器做得很好,让你认为像
int
long
这样的值类型有方法

如果你在QI上,斯蒂芬·弗莱做了一件像易受影响的白痴认为聪明人那样的正常事情,那么他就会做出反应“任何不从System.ValueType继承的对象根据定义必须是引用类型”,带有klaxon和闪烁屏幕,显示“所有对象都是值类型或引用类型”

他接着指出,最初在计算机科学中,object是指任何可以被计算机操纵的实体,因此包括指针,而.NET有指针,尽管它们不符合后来对object的定义(后来这个词用某种屈尊的语气说)这是指用它们的方法封装的对象,因此你错了

艾伦·戴维斯(Alan Davies)会指出,每个人都知道你的意思,但这已经太晚了,你的发言只会助长弗莱自命不凡的热情,特别是因为在他认为自己可以明智地谈论的事情中,科技可能仅次于奥斯卡·王尔德(在他所不知道的事情中,也许是首屈一指的,现在我想起来了,他不可能不以某种方式说错话而不说错话)

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


(向那些没有看过太多英国电视的人道歉,因此他们不知道这是什么意思)。

请看这里:指针两者都不是。但不能称它们为对象。@HansPassant你可以故意装傻,说它们是另一种意义上的对象(例如,在C中,它们被称为对象)。不过,你必须故意迟钝地说,它们不是.NET世界中“对象”的意思。
System.ValueType
也继承自
System.object
。因此,按照这种逻辑,所有的值类型都是引用类型。(在AkharRoop编辑包含图形后,上述注释不再有效。)它们确实有方法。这不是幻觉。@Eric尽管编译器在帮助抖动有效调用它们方面做得很好,这要感谢受约束的操作码;@Eric Lippert:如果我有一个结构(例如
System.Collections.Generic.List
1+枚举器[System.Int32]
),并在一个装箱实例上调用一个方法(例如
IEnumerable`.MoveNext()),系统是直接调用与我在结构上调用方法相同的方法,还是调用其他方法?它似乎没有取消装箱实例,因为函数执行的突变会影响装箱实例。我对该行为的解释是,有一个包装函数在装箱实例上调用请求的函数对象。这就是工作原理吗?@Eric Lippert:这是在什么阶段发生的?CallVirt是否检查目标的类型并确定它需要的是值ref而不是堆引用,或者vtable是否指向处理该问题的包装器方法?在CallVirt中进行检查似乎会降低通信的效率以防万一。我倾向于在“气”出现时翻身;-)明智的选择。不幸的是,我的孩子们通常不会翻身,所以我只是指出错误和“正确”的答案,这只是在玩弄语义。