C# 装箱与拆箱

参考文章 https://www.cnblogs.com/dabiaoge/p/4112581.html


值类型转换为引用类型叫装箱,反之就叫拆箱。

概念:由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。

装箱(Boxing):对值类型的一种操作,在值类型转换为引用类型对象时,将值类型字段拷贝到托管堆上发生的内存分配,这与引用类型内存分配以及对数据操作是一模一样的,由GC来回收,将失去值类型性能优势。
值类型按引用传递时,不会对值类型装箱。
拆箱(UnBoxing):把托管堆上值类型数据传递到栈。

object o = 1;装箱
int i = (int)o;拆箱

为何需要装箱?
类型不确定时,或者可以传入任意类型时。
调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。
一个非泛型的容器,将元素类型定义为Object,以便通用。

装箱操作:  
  第一步:新分配托管堆内存(值类型实例,一个方法表指针,一个SyncBlockIndex)。 
  第二步:将值类型的实例字段拷贝到新分配的内存中。 
  第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。 
拆箱操作:检查对象实例,确保它是给定值类型的一个装箱值,将该值从实例复制到值类型变量中。

猜你喜欢

转载自blog.csdn.net/tran119/article/details/81387877