装箱用于在垃圾回收堆中存储值类型。装箱是值类型(C# 参考)到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
请看以下值类型变量的声明:
| C# | 复制代码 |
|---|---|
int i = 123; | |
以下语句对变量 i 隐式应用装箱操作:
| C# | 复制代码 |
|---|---|
object o = i; // implicit boxing | |
此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。
还可以像下面的示例一样显式执行装箱,不过显式装箱从来不是必需的:
| C# | 复制代码 |
|---|---|
int i = 123; object o = (object) i; // explicit boxing | |
示例
此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。
| 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
C# 语言规范
有关更多信息,请参见 C# 语言规范中的以下各章节:
-
4.3.1 装箱转换