从内存执行的角度来看,值类型的内存分配在线程的堆栈上,而引用类型的内存分配在托管堆上。所以从值类型向引用类型的转换,势必牵涉到数据的拷贝与指针引用等操做。c#
装箱操做,大体过程为:在托管堆中分配新对象的内存,将值类型的字段拷贝到该内存中,而后返回该对象的地址,这样就完成了从值类型到引用类型的转变;拆箱操做,则是获取已装箱对象中来自值类型部分字段的地址。装箱与拆箱并不是彻底对称的互逆操做,拆箱并不包含字段的拷贝。数据结构
概念雷区:性能
值类型,提供了轻量型的数据结构,具备较少的内存开销,对系统性能有明显的做用。而缺点是:缺省方法表指针,由于没法在指望System.Object或其继承类的方法上调用值类型。spa
装箱过程解析线程
拆箱过程解析指针
1 public static void Main() 2 { 3 int i = 100; 4 //装箱 5 i.GetType(); 6 //未装箱 7 i.ToString(); 8 //显式装箱 9 object o = i; 10 Hashtable ht = new Hashtable(); 11 ht.Add("One", o); 12 ht.Add("Two", o); 13 }
GetType方法由System.Object类型提供,所以值类型调用时必须执行装箱操做;而ToString方法则由int类型覆盖,所以不会装箱。Hashtable的Add方法接受System.Object类型的参数,所以经过显式的类型转换来减小隐式的装箱操做。code