.NET中的数据分为引用类型和值类型。
引用类型继承自System.object,值类型继承自System.ValueType.
我们自己定义的类和.NET Framework提供的类,都是属于引用类型。一般的简单类型如int,string和结构体等等都是属于值类型。
引用类型和值类型在内存中所占的位置也是不同的,引用类型分配于托管堆上,而值类型分配于当前线程的堆栈空间上。
装箱的过程就是将值类型变为引用类型的过程。整个过程大体是:申请托管堆空间--复制值类型的变量值到托管堆空间中--在当前线程堆栈空间分配一个指针指向该托管堆空间。一个值类型就通过这几步被封装为一个引用类型了。
拆箱的过程与之基本相反。即把引用类型的值从托管堆复制出新申请的堆栈空间单元中,删除指向托管堆的指针。
什么情况下发生装箱和拆箱呢?
例如,.NET中所有类的最上层基类都是System.Object,System.ValueType也不例外,System.Object中有很多公共的方法,如ToString(),Equal()等,继承自System.ValueType的值类型在调用这些方法时,就必须要经历一个装箱的过程,如:
int nType=2;
Console.Writeline(nType.ToString()); // "2"
一个拆箱的例子:
int nType = 2;
object objTemp = (Object)nType; // 装箱
int nCopyType = (int)objTemp; // 拆箱
装箱拆箱过程所带来的运行效率的降低可想而知。
在编写代码过程中应尽量避免装箱拆箱的操作。