装箱用于在垃圾回收堆中存储值类型。装箱是值类型(C# 参考)object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

请看以下值类型变量的声明:

C# CopyCode image复制代码
int i = 123;

以下语句对变量 i 隐式应用装箱操作:

C# CopyCode image复制代码
object o = i;  // implicit boxing

此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 io 之间的差异。

装箱转换

图片:BoxingConversion

还可以像下面的示例一样显式执行装箱,不过显式装箱从来不是必需的:

C# CopyCode image复制代码
int i = 123;
object o = (object) i;  // explicit boxing

示例

此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。

C# CopyCode image复制代码
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

C# 语言规范

有关更多信息,请参见 C# 语言规范中的以下各章节:

  • 4.3.1 装箱转换

请参见