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

问题描述:

我们如何能够将一个整数分配给.NET中的对象?如何将“int”分配给对象?

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

那么,它怎么可能?

你是boxing对象中的整数。

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

+0

拳击是一种物理现象。这是如何实际发生的(整数不属于System.Object)? – SeeSharp 2011-03-21 20:16:25

+0

来自同一文件的dtb报价总结得很好。 – BoltClock 2011-03-21 20:19:43

INT在.NET具有底层整数类型的对象和一个隐式转换。

+5

我觉得你让.NET和Java混淆了。并且没有任何隐含的转换正在进行;它仍然是一个整数,伪装成一个对象。 – BoltClock 2011-03-21 20:17:05

+0

哦,是的,我做到了。这就是我发布之前没有花时间思考的问题。 – 2011-03-22 13:04:16

+0

@BoltClock其实,由于奇怪的情况,pwny是一种正确的。 .net中的int类型(和其他数字类型)是一种“神奇”类型:单独的“int”值只有4个字节,这意味着它不能有RTTI。只有当你试图将它用作对象时(比如装箱时),它才会放入一个'System.Integer'实例,它只是一个包装器。如果你通过Reflector查看'System.Integer'类,你会发现它唯一的成员是'int m_value'。因此,这是一种隐含的转换,唯一的一点是它发生在比预期更低的层次上。 – zneak 2011-03-28 19:46:04

Boxing and Unboxing

拳击为值类型转换为类型对象或由该值类型实现的任何接口类型的过程。当CLR放置一个值类型时,它将该值包装在System.Object中并将其存储在托管堆中。拆箱从对象中提取值类型。

你应该在C#这应该告诉你boxing and unboxing读了他们是如何/为什么。

此环节都有很好的解释和说明参考VS值类型的问题你问:

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

拳击如干脆把在包装一个基本类型(使它完全吹成对象),并拆开包装对象并将其转换回更简单的类型。要执行装箱管理的内存需要在堆上分配,需要更新引用,并且必须复制值类型的内容。

System.ValueType也从System派生。对象,所以这就是为什么:

请参见继承层次这里:

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

试试这个方法:

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

术语 “拳” 是非常不透明的,但很容易使用调试器可视化实际进行的操作。写一个像这样的小控制台模式应用程序:

using System; 

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

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

0x01CBF6BC 6e1a2d34 0000002a 

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

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

对此进行实验,使用不同的值和不同的类型来查看它如何影响装箱对象。您可以修改十六进制并查看它对调试器显示的obj值有何影响。

我给你的十六进制转储是一个4字节的盒装值,装一个double将需要8个字节。装箱一个结构将需要更多的字节。还有一部分对象头是你看不到的,也就是所谓的同步块,位于地址处。4.尝试使用锁定语句来查看改变。

+4

+1优秀的运动;很有意思。 – 2013-01-22 06:33:06