购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱04
变幻莫测
——拆箱存在的隐患

1.陷阱产生的场景

拆箱是装箱操作的逆向操作过程,把引用类型的对象转换为对应的值类型的值,从内存中堆栈分配的角度来说,就是把堆中的对象复制到堆栈中。由于System.Object类型也是所有值类型的基类,所以在装箱的过程中,值类型都可以隐式地转换为System.Object类型,并且一般不会存在隐患。但是在拆箱时需要特别注意,若类型处理不当,则会产生异常。

例4.4 拆箱存在的隐患(光盘位置:光盘\MR\Instance\4\04\BoxingAndUnBoxing),该实例的主要代码如下:

在上面的代码中,装箱操作毫无疑问,完全能够正常执行;接下来仔细查看拆箱部分的代码,由于Int64类型的取值范围要比Int32类型大得多,所以看起来把Int32类型的值赋给Int64类型的变量应该不会出错,但运行结果却出人意料,如图4.7所示。

图4.7 装箱和拆箱的执行结果

2.陷阱的分析

从运行结果中看到,程序将抛出一个InvalidCastException类型的异常,这个异常的含义是无效类型转换或显式转换引发异常。这说明该异常是因被拆箱对象的最初类型与拆箱时的值类型不一致而产生的,同时也论证了拆箱时的一条原则,被拆箱对象的最初类型与拆箱时的值类型必须一致。

3.陷阱的解决方法

解决办法很简单,就是让拆箱对象的最初类型与拆箱时的值类型保持一致,改正后的关键代码如下:

技巧

装箱和拆箱操作会影响系统性能。并且拆箱操作容易产生隐患,所以建议,在可以确定类型的情况下,应该尽可能地使用泛型技术来处理,这样可以避免大量地使用拆箱和装箱操作。 iXQkvYLnukZMNkRao2mcuIqYWvS+d1SAF4P2FrdMYKrmet4xZYjze81Ma9ngQHOL

点击中间区域
呼出菜单
上一章
目录
下一章
×