• Effective C#:推荐使用is或as操作符而不是强制类型转换


          C#是一种强类型的语言。在编程的过程中,我们都不可避免的会碰到类型转换的问题。这时,我们有两个选择:使用as操作符,或者使用强制类型转换。更保险的做法,首先使用is测试一下转换能否成功,然后再用as或强制类型转换。

          正确的做法是,尽可能地使用as操作符,因为相当于强制类型转换来说,as更加安全,也更加高效。不过,as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象。

          

                //Version one
                object castObj = Factory.GetObject();//return a MyType object
    
                MyType myType = castObj as MyType;
    
                if (null != myType)
                {
                }
    
                //Version two
                object castObj = Factory.GetObject();//return a MyType object
    
                try
                {
                    MyType myType;
                    myType = (MyType)castObj;
                    if (null != myType)
                    {
                        //...
                    }
                }
                catch(InvalidCastException ex)
                {
                    //...
                }

          1.使用as操作符,仅需要对转换后的对象是否为null进行判断即可;但是强制类型转换,除了由于可能出现转换异常,需要添加try...catch以外,还需要对转换后的结果进行null判断。相较而言,使用as更加易读,高效,安全。

          特别强调的是,用户自定义的转换操作符仅能操作于对象的编译期类型,而不是运行时类型。

         

          但是,as操作符也不是万能,既然有强制类型转换的存在,那么必然有它的用武之地。

          2.as操作符并不能用于值类型转换,因为值类型永远不可能为null。所以碰到值类型转换问题,我们仍应该使用强制类型转换,并且可以用is操作符判断,来避免抛出异常。

            object castObj = Factory.GetValue();//return an int value 
    
            int  intValue = 0;
            if (castObj is int)
            {
                intValue = (int)castObj;
            }

          注意,仅当不能使用as进行转换时,才应该使用is操作符。否则,is就是多余的。

         

          3.foreach使用强制类型转换将对象转成循环中将要使用的类型。使用强制类型转换,这样就可以同时来支持值类型和引用类型。不过,我们在使用foreach的时候,也会碰到循环中抛出InvalidCastException异常的现象。

          

  • 相关阅读:
    nginx 服务企业应用
    3D模型展示以及体积、表面积计算
    php实现MySQL读写分离
    three.js实现3D模型展示
    thinkphp5.1+think-queue
    GIT记住远端仓库地址密码
    php实现采集(仅做参考)
    phpStudy集成环境apche+openssl配置本地https
    HTTP与HTTPS区别
    在父页面用Iframe加载子页面时,将父页面的title替换成子页面title
  • 原文地址:https://www.cnblogs.com/ByronsHome/p/3373689.html
Copyright © 2020-2023  润新知