zoukankan      html  css  js  c++  java
  • 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在大部分的情况下都是正确的选择,而且它们只在目标类型转换正确的时候才起作用。相比之下显式类型转换可能会在你意想不到的地方成功或者失败,这将为你的程序带来一些负作用。

  • 相关阅读:
    阿里云部署SSL证书详解
    PHP网站从Apache转移到Nginx后产生404错误的原因和解决办法
    APACHE服务器出现No input file specified.的完美解决方案
    Lnmp修改php.ini配置
    CGI,FASTCGI,PHPFPM的区别
    CLR Via CSharp读书笔记(25):线程基础
    Java Network Programming FAQ.
    SchemaFree MySQL vs NoSQL
    ERROR: JDWP Unable to get JNI 1.2 environment
    Firebug Internals
  • 原文地址:https://www.cnblogs.com/liaozh/p/1822503.html
Copyright © 2011-2022 走看看