分享

C#中值类型和引用类型之间的转换

 昵称11430195 2013-01-24

2.4.3 值类型与引用类型间转换

值类型与引用类型间转换也称为装箱拆箱操作,将基本类型或值类型转换成引用类型称为装箱,将引用类型转换为基本类型或值类型称为拆箱。

1.装箱

【例2-21】装箱,把值类型转换为引用类型。

int i=10;

object obj=i;

i=20;

说明:这里包含了装箱的操作。这段代码将一个值类型变成了引用类型。具体代码的含义如下:

1) int i=10:定义了一个整型变量i并赋初值。

2) object obj=i:定义了一个引用类型obj,并将i的值赋值给obj,实现了装箱操作。扩大转换,可以隐式转换。

3) i=20:改变i的值,obj的值并不发生变化。

实现的实质是:引用类型obj被赋值时,是将整型变量i10复制存储到内存的一个区域(堆中),obj中存放此内存空间的指针(栈中)。所以i发生变化并不影响obj的值。

2.拆箱

【例2-22】拆箱,把引用类型转换为值类型。

object obj=10;

int i=(int)obj;

i=20;

说明:这里包含了拆箱的操作。这段代码将一个引用类型变成了值类型。具体代码的含义如下:

1) object obj=10:为引用类型obj赋值。

2) int i=(int)obj:将引用类型obj显示转换为整型,实现了拆箱操作。这里是收缩转换,必须采用显式转换。

3) i=20:整型变量值发生了改变,不影响obj的值。

装箱拆箱操作实质上是增加指针与去掉指针的操作,是一个挺浪费资源的过程,还可能引发错误。如果被拆箱的引用类型值为空null,或与对应基本类型或值类型冲突,就会引发抛出Sysytem.InvalidCastException异常。

【例2-23】拆箱异常。

object obj=10;

//float f=( float)obj;

说明:拆箱时类型指定与值不相符。因为obj值是个整型,要拆箱为浮点类型,就会发生异常。

值类型与引用类型间之所以能相互转换,是它们的根都是object类,都隐式继承于object类。没有这个前提,它们之间就无法实现相互转换。

归根结底,这些转换还是继承关系间对象的转换,不存在继承关系,转换就不可能实现。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多