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


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/xxdddail/article/details/36655219
    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#第四版》中更倾向于写法二。


  • 相关阅读:
    HTML5 ④
    HTML5 ③
    HTML5 ②
    HTML5 ①
    what’s this?
    第一篇
    2017年3月1号课堂笔记
    2017年2月27号课堂笔记
    2017年2月24号课堂笔记
    2017.02.15课堂笔记
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10664449.html
Copyright © 2020-2023  润新知