在.net中所有的类型都继承自System.Object,所有的类型都是对象.类型主要分为两种,一是值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct).另一类是引用类型,包括类、数组、接口、委托、字符串等.
其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存.
而引用类型则是在堆中分配的,在堆种分配内存,而其托管堆进行垃圾回收.
当两种数据类型进行转换时就引出了装箱/拆箱.
装箱:值类型到引用类型或到此值类型所实现的任何接口类型的隐式转换
例如: int temp = 3;
System.Object obj = temp;
其中,temp为值类型,在栈中分配;当分配obj这个引用类型时,我们需要在堆中分配一个obj对象,然后把temp值赋给它,这么一系列的过程就是装箱的过程。
拆箱:从引用类型到任意值类型的显式转换。与装箱不同,拆箱式显示装换。
例如:int temp = 3;
System.Object obj = temp;
int i = (int) obj;
拆箱过程中,首先来确定对象obj为一个值类型的装箱值,然后把值赋给值类型。
加个例子强化一下理解,
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时拆箱。
装箱和拆箱虽然满足了两只类型之间的转换。但是当量特别大是肯定会大大影响程序的效率。所以,在应用中,我们应该尽量避免装箱和拆箱操作。 |