装箱和拆箱

版权声明:转载请注明出处:http://blog.csdn.net/Cool__King https://blog.csdn.net/Cool__King/article/details/82110173

1.  装箱和拆箱

装箱 就是把值类型转换成引用类型

拆箱 就是把引用类型转换成值类型

首先,我们要弄明白为什么需要装箱和拆箱。C#的所有类型,包括intbool等,都继承自System.Object,但是却又有值类型和引用类型之分与此对应,内存分配被分成了两种方式,一为栈,二为堆, 值类型只会在栈中分配。引用类型分配内存与托管堆。

        对象是创建在堆上的,它的创建和销毁必然带来额外的CPU和内存消耗。如果将intboo等微小而常用的数据类型都放在堆上创建和销毁,语言的性能将会被极大的限制,有时甚至是无法忍受的。C#将值类型和引用类型分开,值类型直接在栈中被创建,超过作用域后直接销毁。当需要值类型成为对象时,使用装箱操作,让值类型变为一个引用类型的对象。这样,我们就可以使用object作为通用的接口统一语言内的一切类型。

         拆箱事实上是装箱的逆操作,也就是说我们只对装过箱的引用类型(通常是object对象)进行拆箱操作。单纯拆箱操作的后果无法设想的。

2:装箱/拆箱是什么? 
装箱:用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。 
拆箱:从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

3:为何需要装箱?(为何要将值类型转为引用类型?) 
一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

4装箱/拆箱对执行效率的影响 
从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。 那该如何做呢? 首先,应该尽量避免装箱。 
在第一种情况下,可以通过重载函数来避免。第二种情况,则可以通过泛型来避免。 改造的代码第三方程序集,无法更改,只能是装箱。 

展开阅读全文

没有更多推荐了,返回首页