装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。次之,拆箱所需的强制转换也需要进行大量的计算.
装箱
装箱用于在垃圾回收堆中存储值类型。装箱是到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
int i = 123;
object o = i;
在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。
所以此时改变i的值,o的值是不会变的。因为原始值类型和装箱的对象使用不同的内存位置。
拆箱
拆箱操作包括:
-
检查对象实例,以确保它是给定值类型的装箱值。
-
将该值从实例复制到值类型变量中。
-
int i = 123; // a value type object o = i; // boxing int j = (int)o; // unboxing要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。
尝试取消装箱 null 或对不兼容值类型的引用会导致 。