.net - System.Object 如何在内部存储 "objects"?

标签 .net object store

我在读装箱,书中说“装箱可以正式定义为通过将变量存储在 System.Object< 中显式地将值类型转换为相应引用类型的过程。” (强调)

我的问题不是关于装箱,但这让我开始思考 - 该 System.Object 实例如何以及在何处存储分配给它的值/变量/对象。所以我不仅想知道

object objShort = 5;

还有

object someOtherObj = someReallyComplicatedObject;

我一直在四处寻找,包括here (MSDN System.Object) ,而且我没有看到任何地方描述 System.Object 实例实际如何存储其数据。

对象只是简单地存储指向分配给它的对象的指针,还是在装箱的情况下,存储指向堆栈上值类型的指针?

(乔恩,如果这也在你的书里,请原谅我。我已经订购了它,它正在路上!)

最佳答案

关于拳击的描述是不准确的。创建的对象不仅仅是一个简单的 System.Object 的实例;每个值类型实际上都有自己的“隐藏”对应引用类型,它只是一个派生自 ValueType 的类,实现与值类型相同的接口(interface),并具有值类型类型的字段。这当然是我的想法,至少,这也是 CLI 规范描述它的大致方式。 System.Object 本身没有对此有任何存储。

我还想更正“存储变量”部分 - 装箱将 存储在一个对象中。该值可能是变量的值、方法调用的结果或其他任何内容。

当然对于引用类型,根本不需要装箱。不过,您确实需要区分引用对象 - 一旦您在脑海中清楚地了解了这两者,大多数其他事情就很容易理解了。然后记住,变量的值永远不是对象——它只是一个值类型值或一个引用(或一个指针 :)

(哦,这在 C# 深度中有一些介绍,但不是很详细。不过您可能对 Eric Lippert 的帖子 "The Truth About Value Types" 感兴趣。)

关于.net - System.Object 如何在内部存储 "objects"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5096371/

相关文章:

javascript - 数组中的 AngularJS 对象到新对象

extjs - 商店的动态 URL 不适用于分页工具栏

javascript - 使用列名获取存储值 - EXTJS 4

javascript - 如果具有相同属性值的对象已存在,则插入时跳过

javascript - 添加属性/方法的明确最佳方式

extjs - 如何将一些 EXTJS Grids 数据写入一个请求?

c# - 文件解析为太长的路径。最大长度为 260 个字符

C# 如何正确地对遵循装饰器模式的类进行单元测试?

C# VS.NET 2008 更改每个配置的设置

c# - NHtmlUnit错误 "Could not generate DH keypair"