Han*_*ant 19
术语"装箱"非常不透明,但通过使用调试器可以很容易地看到实际发生的情况.写一个像这样的小控制台模式应用程序:
using System;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
int value = 42;
object obj = value;
} // <== Breakpoint here
}
}
Run Code Online (Sandbox Code Playgroud)
在指示的位置设置断点并按F5.当断点命中时,使用Debug + Windows + Memory + Memory 1.在地址框中,键入"obj".您将获得对象的内存内容的十六进制转储.右键单击窗口并选择"4字节整数",这是在这种情况下可视化对象的最佳方法.你会看到类似这样的东西:
0x01CBF6BC 6e1a2d34 0000002a
Run Code Online (Sandbox Code Playgroud)
这里有趣的部分是0x01CBF6BC,这是垃圾收集堆上对象的地址.下一个十六进制数6e1a2d34是所谓的"类型句柄",也称为"方法表指针".这是一个标识对象类型的"cookie".在这种情况下,System.Int32.非常重要的是,稍后将对象取消装箱回Int32以验证盒装值实际上是整数时使用.
您看到的下一个值0000002a是盒装对象的值.你可以在程序员模式下使用Windows计算器转换回十进制,它是42.
试验一下,使用不同的值和不同的类型来查看它如何影响盒装对象.您可以修改十六进制,看看它对调试器显示的obj值有什么影响.
我给你的十六进制转储是一个4字节的盒装值,装箱一个double需要8个字节.装箱结构将需要更多的字节.还有一个你看不到的对象标题的一部分,即所谓的syncblock,位于地址 - 4.尝试使用lock语句来查看更改.
Pay*_*aya 13
这是通过的过程中完成的boxing和unboxing.请参阅以下链接以获取进一步参考:
拳击和拆箱(C#编程指南)
价值类型的装箱和拆箱:你需要知道什么?
装箱/拆箱和铸造有什么区别?
如果你看一下System.ValueType,它也源自System.Object
另请参阅ValueTypes 如何从 Object (ReferenceType) 派生并且仍然是 ValueTypes
| 归档时间: |
|
| 查看次数: |
29613 次 |
| 最近记录: |