拳击和拆箱概念

时间:2012-04-01 06:34:25

标签: .net boxing

如果我写

int i=100;

然后将它作为int存储在内存中,占用4个字节或存储为object,并在其检索时使用取消装箱概念(从对象类类型对象中提取int)。

2 个答案:

答案 0 :(得分:3)

在你的例子中没有没有装箱,int只需4个字节。只有在object变量中手动存储值类型时才会发生限制。

int i = 100;      // No boxing
i = i + 1;        // No boxing
object o = i;     // Boxing
int j = (int)o;   // Unboxing

答案 1 :(得分:0)

理解装箱的最简单方法是了解一些细节如何在CLI / CLR(从C#或其他.net编译器执行输出的框架层)中处理值类型和引用类型。特别是,需要认识到,对于每种值类型,框架还定义了一个相应的密封引用类型,该类型派生自类System.ValueType(后者继承自System.Object)并具有相同的公共和私有字段作为原始值类型(*)。值类型的存储位置始终保持值类型,而引用类型的存储位置始终保持引用类型。没有例外。如果尝试在需要引用类型的情况下使用值类型,系统将创建与该值类型对应的引用类型的新实例,从要存储的值复制公共和私有字段,以及然后使用那个新实例。这被称为“拳击”。

请注意,虽然C#假装所有值类型都继承自System.Object,但这样的语句依赖于松散的“继承”定义,这种定义可能比有用更容易混淆。如果定义语句“X继承Y”表示“X的实例可以隐式用作Y的实例”,则未装箱的值类型会执行继承Object,但可以将它们的值复制到盒装值类型的实例中。