装箱(boxing)和拆箱(unboxing) [转]

1.  装箱和拆箱

装箱 就是把“值类型”转换成“引用类型”;

拆箱 就是把“引用类型”转换成“值类型”;

首先,我们要弄明白为什么需要装箱和拆箱。C#的所有类型,包括int、boo等,都继承自System.Object,但是却又有值类型和引用类型之分。这时你要问,int是继承自object类型的,object是引用类型,那为何int不是引用类型而是值类型的呢?这就涉及到装箱和拆箱的概念了。

         我们知道对象是创建在堆上的,它的创建和销毁必然带来额外的CPU和内存消耗。如果将int,boo等微小而常用的数据类型都放在堆上创建和销毁,语言的性能将会被极大的限制,有时甚至是无法忍受的。C#将值类型和引用类型分开,值类型直接在栈中被创建,超过作用域后直接销毁。当需要值类型成为对象时,使用装箱操作,让值类型变为一个引用类型的对象。这样,我们就可以使用object作为通用的接口统一语言内的一切类型。

        拆箱 在MSDN官方文档里用的是 取消装箱。事实上拆箱是装箱的逆操作,也就是说我们只对装过箱的引用类型(通常是object对象)进行拆箱操作。单纯拆箱操作的后果无法设想的。

        装箱和拆箱是C#的核心概念,C#利用其完成类型系统的统一。有了装箱,任何类型的值都可以视为一个对象。CLR在装箱时是将值类型包装到System.Object的内部,再将其存储到托管堆上。拆箱是从对象中提取值类型。装箱是隐式的而拆箱是显示的。

//装箱 boxing
int i = 3 ;  //分配在栈上
object o = i ;//隐式装箱操作,int i 在堆上
object b = (object)i ; //显示装箱操作
//拆箱 unboxing
int j = (int) o ;//显示拆箱(将对象o拆箱为int类型)
 
int k = b ;//error!!, 不能隐式拆箱

拆箱 的操作包括

1,检查对象实例,以却确保它是给定值类型的装箱值。

2,将该值从实例复制到值类型变量中。

 下面来看看这个例子:

int i=0;
System.Object obj=i;
Console.WriteLine(i+","+(int)obj);


其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?!
第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱!
拆箱就是(int)obj,将obj拆箱!! 

你可能感兴趣的:(C#,unboxing,boxing)