我的鸡肋条之二: 也说C#的cast
在读代码的时候有机会经常看到这样的书写方式。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果是用惯C++的用户可能马上就会把心脏提到嗓子眼儿,这样的代码不会有危险吗?能确认这样的强制转换不会出现问题吗?
让我们做一下测试就会发现,在C#中
ClassA与ClassB没有任何继承关系的话,
编译时能为我们抛出CS0030错误,编译都过不了的问题自然不用担心。
ClassA与ClassB有继承关系的话,
如果ClassA是父类那么一切正常,不会出现问题。
如果ClassA是子类,当执行这条语句时会被抛出System.InvalidCastException异常。
OK,C#真够健壮,毫无问题!
于是应该可以得到这样的结论,C#语言的cast与C语言中的不同,从动作式样来看,它的内部实现了类似C++中的dynamic_cast。可以放宽心使用。
在这个基础之上让我再延伸的讨论一下C#的cast。
在调试程序的时候发生了System.InvalidCastException异常,发生异常的地方刚刚好是用cast的地方。
这个时候有两种解决办法:
一种是程序的错误。
一种是没有做异常处理。
如果是程序的错误,那么检测程序-->修改Bug-->重新测试-->...这个比较直接。
可是在不得不处理这个异常的时候就有些让人不爽了,不的不处理这个异常代表这样一个客观事实。
只有在程序跑起来的时候才能确定cast一个什么东西...
解决办法:
我在做些个人的小程序中曾经不止一次的try catch过; 不好。
后来有看了一遍C#的语言手册,学会了用is先判断后执行;还成,有点儿性能问题。
先问是ClassA吗?那么让你cast。
后来有再看了一遍C#的语言手册,学会了用as代入; 我是满意了。
不是ClassA的话我就不执行。
--
这不仅包袱太小,还抻的太长,写到最后的时候我脸红了。