我知道“拳击”是什么:
object myBox = 5;
现在我希望增加我的知识。是否为此拳击操作创建了特殊类型?或者是System.Object
使用了吗? .NET如何处理拳击?
答案 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(公共语言运行时)的作用:
我发现这个装箱/拆箱/引用类型/值类型业务最令人困惑的是,一方面,一切都是一个对象,甚至值类型都是对象,并且派生自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)