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。