理解装箱和拆箱
什么是装箱和拆箱
装箱是将值类型转换为引用类型或者是值类型(如:结构)实现任一接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。拆箱就是将从对象中提取值类型或者接口类型到实现该接口的值类型的显式转换。装箱时隐性的,拆箱是显式的。
装箱
装箱是值类型到引用类型或者这个值类型所实现的任何接口类型的隐式转换。 对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
下面代码在做装箱操作:在堆栈上创建对象引用 obj,而在堆上则引用 int 类型的值。 该值是赋给变量 i 的值类型值的一个副本。
1 int i = 123; 2 //值类型变成引用类型,装箱,隐式的 3 object obj = i;
下图说明了两个变量 i 和 obj 之间装箱转换:
拆箱
下面的代码表示先进行装箱操作再接着进行拆箱操作:
1 int i = 123; 2 //值类型变成引用类型,装箱,隐式的 3 object obj = i; 4 //将从引用类型中提取值类型,拆箱,显式的 5 int j = (int)obj;
代码过程如图:
拆箱的操作包括:
检查对象实例,以确保它是给定值类型的装箱值。
将该值从实例复制到值类型变量中。
装箱和拆箱对程序性能的影响
相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。 对值类型进行装箱时,必须分配并构造一个新对象。反之,拆箱所需的强制转换也需要进行大量的计算。所以在程序中应该尽量减少装箱和拆箱的操作。