我在读装箱,书中说“装箱可以正式定义为通过将变量存储在 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/