“拳击”如何在.NET中运行?

时间:2011-05-13 20:28:25

标签: .net

我知道“拳击”是什么:

object myBox = 5;

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

3 个答案:

答案 0 :(得分:5)

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

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

类型Box<T>也实现了T的所有方法,接口等,无论T恰好是什么。因此,例如,你可以想象Box<int>有一个方法ToString,它只是在值上调用int.ToString,并返回结果。

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

答案 1 :(得分:2)

CLR处理拳击。

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

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

'i'是一个valueType(一个Int32),作为一个局部变量,在堆栈上分配,它大概只分配4个字节。 然后,将i包裹在一个对象中,即装箱。 CLR(公共语言运行时)的作用:

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

我发现这个装箱/拆箱/引用类型/值类型业务最令人困惑的是,一方面,一切都是一个对象,甚至值类型都是对象,并且派生自System.Object。另一方面,当声明Object时,它始终是引用类型。

所以

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

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

会将i传递给myMethod,即使i是int,valueType,也是一个非常好的对象,因为值类型也是从System.Object派生的。

答案 2 :(得分:0)

提到Bala R ......

没有比MSDN提供的更好的例子

  

Boxing and Unboxing