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类型,而不是运行期的类型。

但是也并非所有情况都如此,需要用强制转换的情况也还是有,比如转为int等值类型。

程序编写中应该尽量避免类型转换操作,但是总有场合必须要使用,此时应该用as或is来清晰表达代码意图。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容