首先装箱拆箱涉及到了数据类型,在.net中所有的类型都继承自System.Object,所有的类型都是对象.类型主要分为两种,一是值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct).另一类是引用类型,包括类、数组、接口、委托、字符串等.
    其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存.
    而引用类型则是在堆中分配的,在堆种分配内存,而其托管堆进行垃圾回收.
当两种数据类型进行转换时就引出了装箱/拆箱.
装箱用于在垃圾回收堆中存储值类型。装箱是值类型到object类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在内存堆中分配一个对象实例,并将该值复制到新的对象中。
int i =123;
object o =i;
此语句的结果是在堆栈上创建对象引用o,而在堆上则引用int类型的值。该值是赋给变量i的值类型值的一个副本。
取消装箱是从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。
取消装箱操作包括:
检查对象实例,以确保它是给定值类型的装箱值。
将该值从实例复制到值类型变量中
int i=123;
object o=i;
int j=(int)o;
此语句的结果是在堆栈上创建对象引用o,而在堆上则引用int类型的值。该值是赋给变量i的值类型值的一个副本。
在加个例子强化一下理解,
        int temp = 3;
      object obj = temp;
      Console.WriteLine (temp + "," + (int) obj);
      在此过程中,进行了3次装箱和1次拆箱;很明显,obj = temp时第一次装箱,temp + "," + (int) obj中,temp要先转换为String类,第2次装箱,(int)obj第3次装箱成引用类型。obj转换为int时拆箱。
另:装箱装的是类型和数据,而转换只转换数据