个人理解(本质):
封箱是把值类型转换为引用类型
拆箱是把引用类型转换为值类型
值类型只会在栈中分配。
引用类型分配内存与托管堆。 托管堆对应于垃圾回收。
装箱是隐式的;拆箱必定是显式的。
怎么理解:要在运行时成功拆箱值类型,被拆箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。??
//装箱:
//对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
//第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个//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等。