Effective|Effective C#笔记 - 优先考虑is或as运算符,尽量少用强制类型转换

C#的静态类型检查机制,可以在编译期就筛选出错误的类型使用,可以帮助构建更安全的代码和程序。但同时,也还是有要在运行期检查对象类型的机制,比如方法中的参数类型是object。这样,我们就需要根据运行时需求转换成所需要的类型。转换的方式有两种,用as转换,或者强制转换。
优先推荐as运算符来转换的理由:
1. 使用as运算符实现类型转换要比盲目强制类型转换要更加安全,也更有效率;
2. as或is运算符不会考虑用户自定义转换操作,只有当运行期的类型与要转换到的类型相符时,转换操作才能成功完成;
3. as或is运算符的转换操作很少会为了类型转换而构建新对象(但若用as运算符把装箱的值类型转换成未装箱且可以为null的值类型,则会创建新的对象);
4. as运算符在转换操作中,如果操作失败时,会返回null,而强制转换则需要考虑转换失败所抛出的异常,额外增加了消耗。
使用区别:

public class Factory { public static object GetObject() { return new MyType(); } }public class MyType {}public void TestMethodUseAs() { object obj = Factory.GetObject(); MyType t = obj as MyType; if(null != t) { // do right thing } }public void TestMethodUseCast() { object obj = Factory.GetObject(); try{ MyType t; t = (MyType)obj; if(null != t) { // do right thing } } catch(InvalidCastException e) { // log error } }

很显然,直接使用as运算符既方便,也安全。强制转换不仅要处理本身为null的情况,还要处理转换失败的异常情况。而两者最大的区别在于如何对待用户定义的转换逻辑。as和is运算符只会判断待转换的对象在运行期是何种类型,并且处理必要的装箱和拆箱操作外,不会执行其它操作。强制类型会考虑用户自定义转换逻辑,但是针对的是源对象的编译期类型,上例中的object类型,而不是运行期的类型。
【Effective|Effective C#笔记 - 优先考虑is或as运算符,尽量少用强制类型转换】但是也并非所有情况都如此,需要用强制转换的情况也还是有,比如转为int等值类型。
程序编写中应该尽量避免类型转换操作,但是总有场合必须要使用,此时应该用as或is来清晰表达代码意图。

    推荐阅读