c#的 as, is 和 型別強制轉換
c#是一門強型別語言,一般情況下,我們最好避免將乙個型別強制轉換為其他型別,但有些時候難免要進行型別轉換。
先想想究竟哪些操作可以進行型別轉換(先不考慮.net提供的parse),一般我們都有以下選擇:
正確的選擇應該是盡可能地使用as操作符,因為它比強制轉型要安全,而且在執行時層面也有比較好的效率(注意的是as和is操作符都不執行任何使用者自定義的轉換,只有當執行時型別與目標轉換型別匹配時,它們才會轉換成功)。
現在我們通過乙個簡單的例子說明as和強制轉換之間的區別,首先我們定義一間獲取不同型別物件的工廠,然後我們把未知型別轉換為自定義型別。
object o = factory.getobject();通過上述**我們發現as型別轉換失敗時值為null不丟擲異常,但強制轉換如果轉換失敗會丟擲異常所以我們要新增異常處理。mytype t = o as mytype;
if (t == null)
else
object o = factory.getobject();
tryelse
}catch
現在我們對as和強制轉換有了初步的了解,假設現在我們定義了乙個抽象類foo,然後foo1繼承於它,並且再定義乙個基類logger,在foo1中定義與logger型別隱式轉換具體如下:
foo1 myfoo; //// inherits abstract class.
logger myfoo; ///
/ base class.
public
class foo1 : foo
}
object myfoo = container.resolve(); //獲取未foo1型別
圖1 轉換失敗結果
首先我們要從編譯和執行時角度來分析,在編譯時myfoo的型別為system.object,這時編譯器會檢測是否存在自定義由object到logger的型別轉換。如果沒有找到合適轉換,編譯器將生成**檢測myfoo的執行時型別和logger比較,由於myfoo的執行時型別為foo1,而且我們自定義了由foo1到logger的型別轉換,估計這樣可以轉換成功了吧!然而恰恰沒有轉換成功,這究竟是什麼原因呢?讓我們了解一下編譯器對於隱式型別轉換的原理吧。
圖2 編譯和執行時自定義型別轉換
通過上圖我們發現使用者自定義的轉換操作符只作用於物件的編譯時型別,而非執行時型別上,ok現在讓修改一下**讓我們編譯器認識自定義型別中。
圖3 轉換成功結果
現在型別可以轉換成功,這是因為編譯器使用了我們自定義的隱式轉換,由於myfoo這次的編譯型別為foo1,編譯器首先查詢是否存在foo1和logger自定義轉換型別,由於我們定義了一種由foo1到logger的隱式型別轉換所以轉換成功。
通過上述我們發現了as給我們帶來的好處,但是有一點我們要注意的是as只能用於引用型別不能用於值型別。那我就有個問題了在進行型別轉換之前如果我們並不知道要轉換的是值型別還是引用型別,那該怎麼辦呢?現在是is登場的時候了。
bject tempfoo = container.resolve(); //as不能用於值型別,這是因為值型別不能為null(注意:c#2.0中,微軟提供了nullable型別,允許用它定義包含null值,即空值的資料型別)像這種情況我們應該使用強制型別轉換。獲取未foo1型別
int myint = tempfoo as
int; //
compile error
object tempfoo = container.resolve(); //獲取未foo1型別
try
}catch
object tempfoo = container.resolve();as和強制轉換之間最大的區別就在於如何處理使用者自定義的轉換。操作符 as和 is 都只檢查被轉換物件的執行時型別,並不執行其他的操作。如果被轉換物件的執行時型別既不是所轉換的目標型別,也不是其派生型別,那麼轉型將告失敗。但是強制轉型則會使用轉換操作符來執行轉型操作,這包括任何內建的數值轉換(如:long轉int)。//獲取未foo1型別
int i =
0;
//值型別轉換
if (tempfoo
isint)
object tempfoo = container.resolve();
//獲取未foo1型別
logger myfoo1 =
null;
//引用型別轉換
if (tempfoo
is logger)
一般情況下:(1)值型別情況:用強制轉換
(2)引用型別情況:用as
(3)不知道的情況:用is,(用if判斷)
優先考慮
使用as
,然後再考慮
使用is,最後
才考慮使用
強制轉換。
as強制轉換
轉換失敗是否丟擲異常 no
yes支援值型別和引用型別轉換
只支援引用型別
yes
關於 as ,is,和強制轉換
1.as只能用於引用型別不能用於值型別。2.操作符 as和 is 都只檢查被轉換物件的執行時型別,並不執行其他的操作 3.is的原理與as類似,不過它返回bool型別,is可與強制型別轉換搭配使用,可避免轉換異常,但最好不要把is和as搭配,實際上is也做了as的轉換操作,這樣會影響效率.4.如果我...
C和C 的強制型別轉換
一般來說,我們需要型別轉換的場景可以分為如下幾種 1.c風格的強制轉換 c風格的強制轉換很簡單,有顯示轉換和隱式轉換,顯示轉換不管什麼型別之間都是用以下方式 type a type b 將b的型別強制轉換為a的型別 但是c風格的強制轉換可能帶來一些隱患,讓一些問題難以察覺.所以c 提供了一組可以用在...
型別轉換中as is的使用
型別轉換包括顯示轉換和隱式轉換,在.net中型別轉換的基本規則如下 is as操作符,是c 中用於型別轉換的,提供了對型別相容性的判斷,從而使得型別轉換控制在安全的範疇,提供了靈活的型別轉換控制。is的規則如下 as的規則如下 as 運算子用於在相容的引用型別之間執行某些型別的轉換 例如 objec...