C# is與as

Andy Niu發表於2013-11-26

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。

相關文章