zoukankan      html  css  js  c++  java
  • 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异常的现象。

          

  • 相关阅读:
    发一弹
    压缩图片
    页面返回并刷新页面
    贤心的WEB弹窗挺不错的
    SMS短信发送API 以后可以弄个短信验证了
    <many-to-one>的fetch属性
    AJAX技术
    中国土地所有权的属性
    Today 's check:mappingResource属性和mappingDirectoryLocations属性的使用
    Pattern类的中文版 菜鸟翻译 有错请纠
  • 原文地址:https://www.cnblogs.com/ByronsHome/p/3373689.html
Copyright © 2011-2022 走看看