zoukankan      html  css  js  c++  java
  • C# is与as

    1、使用场景:

      强制类型转换,有可能会导致异常。is与as就是为了解决这一问题,is与as永远不会抛出异常。

    2、is判断一个对象是否兼容于指定的类型,考虑里氏代换。Dog是Animal,而Animal不是Dog。

    3、as 与强制类型转换一样,区别是使用as是安全的。使用as如果转换失败,返回Null,不会抛出异常。

    4、使用is和as可以取代强制类型转换,分别如下:  

     1 a、使用is
     2   if(a is Dog)
     3   {
     4     Dog d = (Dog)a;
     5     ...
     6   }
     7 
     8 b、使用as
     9   Dog d = a as Dog;
    10   if(d!=null)
    11   {
    12     ...
    13   }

       注意:二者效果一样,但是效率差别很大,使用is会检查两次对象的类型,一次是核实,一次是强制转换。使用as只进行了一次对象类型的检查。检查对象的类型,是个耗费资源的操作,首先要判断对象的实际类型,然后必须遍历继承树结构(层次结构),去与每个基类核对。

    5、这个情况类似于C++的中map。在C++中,标准容器map的下标操作有一个危险的副作用,如果该键不存在,下标操作会插入一个具有该键的新元素,新元素的value使用默认构造方法。考虑下面的需求:根据key查找value,存在key,返回value,不存在key,返回null。为了避免出现上面的副作用,使用下面的办法:  

     1 a、使用count
     2   if(m.count(key)>0)
     3   {
     4     return m[key];
     5   }
     6   else
     7   {
     8     return null;
     9   }
    10 
    11 b、使用find
    12   map<int,string>::iterator iter = m.find(key);
    13   if(iter!=m.end())
    14   {
    15     return *iter;
    16   }
    17   else
    18   {
    19     return null;
    20   }

       使用count,进行了两次查找。使用find只进行了一次查找。map 的内部实现使用了二叉树(AVL树或者红黑树),查找的时间效率为对数时间,会影响效率。因此,对于需求,根据key查找value,如果存在就使用,应该使用find。

  • 相关阅读:
    FuelPHP 系列(三) ------ Model 模型
    FuelPHP 系列(二) ------ route 路由
    FuelPHP 系列(一) ------ Oil 命令
    微信小程序初探
    基于 Laravel 的 文件管理
    laravel(一)
    Git从零开始(三)
    Git从零开始(二)
    Git从零开始(一)
    Linux服务器学习(二)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3443883.html
Copyright © 2011-2022 走看看