1.4.2 装箱和拆箱

当值类型的数据转换为引用类型时,CLR会先在托管堆配置一块内存,将值类型的数据复制到这块内存,然后再让托管栈上引用类型的变量指向这块内存,这样的过程称为装箱(Boxing),反之则是拆箱(UnBoxing)。

如图1-7所示,托管栈中类型为Int32(值为1023)的变量,装箱后引用类型变量位于栈中,原来值类型变量的值被放入到托管堆的一个对象中,其内容为1023,类型为Object,然后将位于托管栈中的引用类型变量指向堆中的这个Object类型的对象,这就是装箱的整个过程。

1.4.2 装箱和拆箱 - 图1

图 1-7 装箱

一般来说,装箱操作不需要我们主动去做,当将一个值类型的变量赋值给一个引用类型的变量时,.NET框架会自动帮我们做装箱处理,但拆箱操作并非自动的,我们必须知道被拆箱的对象的实际类型,然后明确地去执行拆箱操作,如代码清单1-1所示。

代码清单1-1 装箱和拆箱


Int32 BirthdayNumber=1023;//Int32类型变量BirthdayNumber

Object BoxingBirthdayNumber=BirthdayNumber;//系统自动装箱

Int32 UnBoxingBirthdayNumber=(Int32)BoxingBirthdayNumber;//明确地拆箱


图1-8演示了拆箱的过程。

1.4.2 装箱和拆箱 - 图2

图 1-8 拆箱

有一点需要注意的是,装箱和拆箱对性能是有影响的,因为它花费了更多的时间。