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异常的现象。

      

原文地址:https://www.cnblogs.com/ByronsHome/p/3373689.html