Item 3: Prefer the is or as Operators to Casts(选择is或者as操作符而不是做强制类型转换)

Item 3: Prefer the is or as Operators to Casts(选择is或者as操作符而不是做强制类型转换)

C#是一种强类型语言。我们应该尽量避免进行强制的类型转换,不必要的类型转换对代码性能影响较大。

  1. as和is操作符比强制转换更为安全和高效,不能对用户自定义的转换进行操作。它们只是简单的比较运行时的被转换类型同目标类型是否相匹配。它们永远不会为转换而新建object.
    as和强制转换二者最大的不同在于对待用户自定义转换的方式。is和as在运行时检验类型是否可以转换,它们不会做任何其他的操作。如果被转换的类型不是特定的类型或其子类则转换失败。而显式类型转换则会进行转换操作将其强制转换为要求类型。这经常会造成数据丢失,例如数据类型之间的转换。
  2. as不适用于值类型
    语句:int i = o as int//不能通过编译
    应该如果o不是Int类型时,i是值类型而永远不可能为null,所以你无论放什么值都会被理解为一个不合理的值。因此这里建议使用强制转换(鉴于强制转换可能会抛异常,必须使用Try和Catch处理异常)。
  3. as和is最后不要同时使用
                object o = Factory.GetObject();
                MyType t 
    = null;
                
    if (o is MyType)
                    t 
    = o as MyType;
    上面的代码中,o is MyType和o as MyType需要做两次转换,低效,而且o is MyType等同于(o as MyType)!= null,又显冗余。上面的代码直接写成下面的形式即可:
                object o = Factory.GetObject();
                MyType t 
    = t = o as MyType;
                
    if (t != null)
                {
                    
    //todo
                }
  4. Foreach中的类型转换
    Foreach循环时,循环的变量可能是值类型,也可能是引用类型,类型转换用什么好呢?
    上面提到,如果是值类型,使用as可能有问题,因此,foreach使用强制转换来循环集合内的元素。这样,不管元素是什么类型,都可以定义相同的操作行为。由于使用强制类型,因此foreach需要处理类型强制转换时抛出的异常。

   在oo设计中我们应当尽量避免类型转换,但是有时候这是无法避免的。这时应当尽量使用is和as来将你的意图表示清晰。不同的强制类型转换有不同的规则。is和as在大部分的情况下都是正确的选择,而且它们只在目标类型转换正确的时候才起作用。相比之下显式类型转换可能会在你意想不到的地方成功或者失败,这将为你的程序带来一些负作用。

原文地址:https://www.cnblogs.com/liaozh/p/1822503.html