什么是装箱和拆箱

 2009浏览

由于C#中所有的数据类型都是从基类System.Object继承而来的,所以值类型和引用类型可以通过显式或隐式操作互相转换,这个过程就被称为装箱(boxing)和拆箱(unboxing)的过程。

什么是装箱(boxing

简单来说就是将值类型转换为引用类型,它是隐式转换。装箱会在堆中分配一个对象实例,并将值复制到新的对象中。

拆箱过程中需要注意以下2

1:已装箱的值类型的引用的变量为NULL,会引发NullRefreenceException异常

2:一个引用指向的对象在拆箱时不是用的装箱时所使用的类型,会引发InvalidCastException异常

什么是拆箱(unboxing

将引用类型转换为值类型,他是显式转换。拆箱首先检查对象实例确保它是给定值类型的一个装箱值,再将该值从实例复制到值类型变量中。

装箱和拆箱的效率

值类型和引用类型最本质的区别就是值类型分配在栈中,而引用类型分配在堆上。装箱操作其实就是把值类型放到堆上,拆箱操作其实就是把在堆上的值取出来放到栈上。从原理商量来讲,装箱会生成全新的引用对象,这会有时间损耗,也就造成了效率的降低。所以要尽量避免装箱。

装箱需要完成以下3个步骤

首先,给值类型在托管堆中分配内存,除了值类型本身所分配内存外,内存总量还要加上类型对象指针和同步块索引所占用的内存。

其次,将值类型的值复制到新分配的堆内存中

最后,返回已经成为引用类型的对象的地址

综上,装箱会带来性能损耗。

流行热度:超过2009次围观
生产日期:2014-11-11 07:07:21
上次围观:2016-09-17 08:18:20
转载时必须以链接形式注明原始出处及本声明。