C#是一個強數據類型語言。好的編程實踐意味著當可以避免從一種數據類型 強制轉化為另種數據類型時,我們應該盡我們的所能來避免它。但在某些時候, 運行時類型檢測是不可避免的。在C#裡,大多數時候你要為調用函數的參數使用 System.Object類型,因為Framwork已經為我們定義了函數的原型。你很可能要 試圖把那些類型進行向下轉化為其它類型的接口或者類。你有兩個選擇:用as運 算符,或者,采用舊式的C風格,強制轉換。(不管是哪一種,)你還必須對變量 進行保護:你可以試著用is進行轉換,然而再用as進行轉換或者強制轉換。
無論何時,正確的選擇是用as運算符進行類型轉換。因為比起盲目的強 制轉換它更安全,而且在運行時效率更高。用as和is運算符進行轉換時,並不是 對所有的用戶定義的類型都能完成的。它們只在運行時類型和目標類型匹配的時 候,轉換才能成功。它們決不會構造一個新的對象來滿足(轉化)要求。
看一個例子。你寫了一段代碼,要轉換一個任意類型的對象實例到一個MyType類 型的實例。你是這樣寫代碼的:
object o = Factory.GetObject( );
// Version one:
MyType t = o as MyType;
if ( t != null )
{
// work with t, it's a MyType.
} else
{
// report the failure.
}
或者你這樣寫:
object o = Factory.GetObject( );
// Version two:
try {
MyType t;
t = ( MyType ) o;
if ( t != null )
{
// work with T, it's a MyType.
} else
{
// Report a null reference failure.
}
} catch
{
// report the conversion failure.
}