Q&A-7-C# 拆箱 装箱

个人理解(本质):

封箱是把值类型转换为引用类型

拆箱是把引用类型转换为值类型

值类型只会在栈中分配。

引用类型分配内存与托管堆。   托管堆对应于垃圾回收。

装箱是隐式的;拆箱必定是显式的。 

怎么理解:要在运行时成功拆箱值类型,被拆箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。??

//装箱:

//对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。

//第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个//SyncBlockIndex)。

//第二步:将值类型的实例字段拷贝到新分配的内存中。

//第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。

//将引用内型转换为值内型,需要进行拆箱操作(unboxing)

//1、首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。

//2、将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。

NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, //byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型得时候都在//堆(HEAP)中分配内存,会造成极低的效率!(个中原因以及关于堆和栈得区别会在另一篇//里单独得说说!)

//.NET如何解决这个问题得了?正是通过将类型分成值型(value)和引用型//(regerencetype),C#中定义的

1、值类型包括原类型(Sbyte、Byte、Short、//Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、//Decimal)、枚举(enum)、结构(struct),

2、引用类型包括:类、数组、接口、委托、//字符串、object等。

猜你喜欢

转载自blog.csdn.net/u014710355/article/details/82498578