Farseer

导航

装箱和拆箱

在C#中,数据类型分为值类型和引用类型。

值类型是简单(Primitive)类型,在栈(stack)上创建,所有的值类型都影射到FCL中Int32-〉System.Int32,double->System.double等,它们都继承自System.ValueType,结构(Structure)和枚举(enumerated)也是在(Stack)上创建的,并且继承自System.ValueType,所以也是值类型。

引用类型,在堆(heap)上创建。所有的类都是引用类型。new 操作符返回对象的地址。

从值类型转变成引用类型称为装箱,反之称为拆箱。

可以用如下方式定义一个变量Systme.ValueType r=5; 那么r是什么类型的那?可以用r.GetType()来查看它的类型,结果输出为System.Int32。它会按照初始值得到自动识别其类型,但在这种情况下不能用r++这样的语句,因为ValueType不是简单类型,而是简单类型的基类,并没有定义++操作,这时编译就会出错。

从值类型装换成引用类型,即装箱,可以隐式(implicit)也可以显式转换。
比如
Int32 a=10;
object x=a;      //隐式转化
Int32 a=10;
object x=(object)a;  //显式转化

拆箱
Int32 a=10;
object x=a;
a=x;                        

上面的语句是不能通过编译的,因为拆箱不能隐式转化。其实很好理解,把苹果说成水果没人会说错,反过来就有错了。从苹果到水果就一条路好走,而反过来却多条路,当然要指定具体的路让他走了,要不然它怎么知道如何去转化?

int a=0;

float  b=1;

object obj=a;

b=(float)obj;

以上语句在编译的时候会顺利通过,但在运行时会抛出指定的转化无效异常。
为什么?
人家给你个香蕉,让你转了一圈成了苹果,别人肯定不干啊。同一变量,在装箱的时候是什么类型,在拆箱时一定要转化成原来的类型。否则会抛出异常。


                   

posted on 2005-03-12 21:09  佛西亚  阅读(438)  评论(0)    收藏  举报