2011-05-13 62 views
2

我知道什么是“拳”是:“拳击”如何在.NET中工作?

object myBox = 5; 

现在,我希望增加我的知识。是为这个拳击操作创建的特殊类型?或者是System.Object使用? .NET如何处理拳击?

+4

有关[拳击和拆箱]的详细信息,请参阅msdn(http://msdn.microsoft.com/zh-cn/library/yz2be5wk。aspx) – 2011-05-13 20:30:08

+0

MSDN拥有您需要的所有信息。 http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – alexn 2011-05-13 20:30:19

+0

是所有关于执行..我没有想到要查看MSDN内 – 2011-05-13 20:33:19

回答

5

没有特殊类型;盒装值类型是运行时的实现细节。但要理解它的最简单的方法就是想象,有一种特殊类型:

class Box<T> where T : struct 
{ 
    T value; 
} 

凡型Box<T>也实现了所有的方法,接口,等等,T的,不管是什么牛逼恰好是。所以,举个例子,你可以想象Box<int>有一个方法ToString,它只是简单地调用int.ToString的值,然后返回结果。

拳击只是一种获取对非参考类型的引用的机制。你只需在盒子周围制作一个盒子,并获得盒子的参考。

+0

谢谢你的回答。很像我一直在想的 – 2011-05-13 20:37:50

2

CLR处理拳击。

考虑在这种情况下会发生什么:

private void myUselessMethod() 
{ 
    int i = 5; 
    object o = i; 
} 

'i'是值类型(一个Int32),并作为一个局部变量,是在栈上分配的,它仅配置4个字节,大概。 然后,i被包装成对象,即盒装。 什么CLR(公共语言运行库)的作用:

  • 它分配在托管堆内存:即,足够的空间,一个Int32,加上其在托管堆中的每个对象必须有两个额外的开销成员空间 - “类型对象指针”和“同步索引”。
  • 它将值5复制到新分配的堆内存中。
  • 它返回堆中的内存地址作为引用o。

我觉得最令人困惑的这个装箱/拆箱/引用类型/值类型的业务是什么,一方面,一切都是对象,甚至是值类型的对象,并System.Object派生。另一方面,当一个对象被声明时,它总是一个引用类型。

所以

void myMethod(System.Object o) 
{ 
    doStuff(); 
} 

void myCallingMethod() 
{ 
    int i = 5; 
    myMethod(i); 
} 

将盒I将它传递给myMethod的,即使i是int,一个VALUETYPE,因此非常清楚的目的,由于值类型从System.Object衍生得。