如何将“int”分配给对象?

我们如何能够在.NET中为一个对象分配一个整数?

引用类型派生自System.Object,值类型来自System.ValueType。

那么,怎么可能呢?

如果查看System.ValueType ,它也是从System.Object派生的

另请参阅ValueTypes如何从Object(ReferenceType)派生,仍然是ValueTypes

术语“装箱”非常不透明,但通过使用调试器可以很容易地看到实际发生的情况。 写一个像这样的小控制台模式应用程序:

 using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int value = 42; object obj = value; } // <== Breakpoint here } } 

在指示的地方设置断点并按F5。 当断点命中时,使用Debug + Windows + Memory + Memory 1.在地址框中,键入“obj”。 您将获得对象的内存内容的hex转储。 右键单击窗口并选择“4字节整数”,这是在这种情况下可视化对象的最佳方法。 你会看到类似这样的东西:

 0x01CBF6BC 6e1a2d34 0000002a 

这里有趣的部分是0x01CBF6BC,这是垃圾收集堆上对象的地址。 下一个hex数6e1a2d34是所谓的“类型句柄”,也称为“方法表指针”。 这是一个标识对象类型的“cookie”。 在这种情况下,System.Int32。 非常重要的是,稍后将对象取消装箱回Int32以validation盒装值实际上是整数时使用。

您看到的下一个值0000002a是盒装对象的值。 你可以在程序员模式下使用Windows计算器转换回十进制,它是42。

试验一下,使用不同的值和不同的类型来查看它如何影响盒装对象。 您可以修改hex,看看它对调试器显示的obj值有什么影响。

我给你的hex转储是一个4字节的盒装值,装箱一个double需要8个字节。 装箱结构将需要更多的字节。 还有一个你看不到的对象标题的一部分,即所谓的syncblock,位于地址 - 4.尝试使用lock语句来查看更改。

这是通过boxingunboxing的过程完成的。 请参阅以下链接以获取进一步参考:

拳击和拆箱(C#编程指南)
拳击和拆箱价值类型:你需要知道什么?
装箱/拆箱和铸造有什么区别?

拳击和拆箱 :

Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程。 当CLR选择一个值类型时,它将值包装在System.Object中并将其存储在托管堆上。 取消装箱从对象中提取值类型。

您正在装入对象中的整数。

也就是说,创建一个包装 (或 )整数的对象。 有点像在现实生活中把东西放在盒子里。

试试这个方法:

 object ob; int i=10; ob=i;//(boxing) int b; b=(int)ob;//(unboxing) 

你应该读一下c#中的装箱和拆箱 ,它应该告诉你如何/为什么。

此链接有一个很好的解释,并解释了您询问的参考和值类型问题:

http://www.dijksterhuis.org/exploring-boxing/

拳击简单地将一个基本类型放在包装器中(使其成为一个完全被吹制的对象),并取消装箱取出该包装对象并将其转换回更简单的类型。 要执行装箱托管内存需要在堆上分配,需要更新引用,并且必须复制值类型的内容。

.NET中的int有一个底层的Integer类型对象和一个隐式转换。

System.ValueType也派生自System.Object,这就是为什么:

请参阅inheritance层次结构:

http://msdn.microsoft.com/en-us/library/system.valuetype.aspx