zoukankan      html  css  js  c++  java
  • 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#第四版》中更倾向于写法二。

  • 相关阅读:
    Redis源代码分析(十三)--- redis-benchmark性能測试
    kvm中运行kvm
    umount.nfs device busy day virsh extend diskSpace, attachDisk
    ultravnc
    openNebula dubug
    maintenance ShellScripts
    virsh VMI deploy data serial xml
    cloud computing platform,virtual authentication encryption
    基于C 的libvirt 接口调用
    storage theory
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605001.html
Copyright © 2011-2022 走看看