【IT168 技术文档】
装箱和取消装箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。取消装箱将从对象中提取值类型。
在此示例中,整型变量 i 被“装箱”并赋值给对象 o 。
C#
int i = 123;
object o = (object) i; // boxing
然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:
o = 123;
i = (int) o; // unboxing
装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例 ,并将该值复制到新的对象中。
C#
class TestBoxing
{
static void Main()
{
int i = 123;
object o = i; // implicit boxing
i = 456; // change the contents of i
System.Console.WriteLine("The value-type value = {0}", i);
System.Console.WriteLine("The object-type value = {0}", o);
}
}
The value-type value = 456
The object-type value = 123
此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储的是不同的值。
需要说明的是,值类型是在栈上分配的,而引用类型在托管堆上分配,把一个值类型装箱,会在托管堆上重新分配一块内存,然后把值复制给这个新分配对象的内存中,然后返回这块新分配的内存。对引用类型的改动不会再作用于原来的值类型。