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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM