• is和as在类型转换时的性能差异


    is和as是.NET中常用的操作,两者都可以实现类型的安全转换,但两者却有所不同。

    public class Employee
    {
    
    }
    
    public void Add(object obj)//写法一
    {
       Employee e=null;
       if(obj is Employee)
       {
           e=(Employee)obj;
           //正常处理
       }
       else
       {
           //其他处理
       }
    }
    
    public void Add(object obj)//写法二
    {
       Employee e=obj as Employee;
       if(obj==null)
       {
          //其他处理
       }
       else
       {
         //正常处理
       }
    }
    

    上面的代码中都是将obj转换成Employee,两者在写法上都是OK的,也可以编译和运行。但是两者在性能上却有些许差别。
    is操作需要判断obj的类型是不是Employee,如果是则进行强制转换e=(Employee)obj。在强制转换时,CLR又会对obj进行一次类型的判断,如果不是Employee类型,
    则会抛出异常System.InvalidCastException。
    as操作符,在CLR阶段会进行一次类型判断,如果是Employee,则转换为Employee类型,如果不是,则转换成null。所以这才有了写法二中的if(obj==null)的判断。
    相信到这里,已经明白了这两种写法在性能上的差异。is的写法需要两次类型判断,as只需要一次类型判断。
    当然,有的程序员直接是采用下面的这种写法:

    public void Add(object obj)//写法三
    {
      try
      {
         Employee e=(Employee)obj;
         //正常处理
      }
      catch
     {
       //其他处理
       throw;
     }
    }

    写法三在程序上是可行的,但是利用try--catch来捕获强制转换失败的异常,性能影响更大,不是推荐的写法。
    在《CLR via C#第四版》中更倾向于写法二。

  • 相关阅读:
    I Show
    Centos上安装Google Authenticator
    linux 上mailx通过465端口发送邮件
    Win10 RDP CredSSP报错处理
    linux 双网卡代理上网
    English trip EM3-LP2B Teacher:Taylor
    【BZOJ1984】月下“毛景树”-树链剖分
    c++ 数据对拍器
    【BZOJ2157】旅游-树链剖分
    游戏-博弈论-树形DP
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605001.html
Copyright © 2020-2023  润新知