你會同意第一種寫法更簡單更容易讀。它沒有try/catch結構, 所以你可以同時避免(性能)開銷和(多寫)代碼。我們注意到,強制轉換的方法為 了檢測轉換是否把一個null的對象進行強制轉換,而不得不添加一個捕獲異常的 結構。null可以被轉換為任意的引用類型,但as操作符就算是轉化一個null的引 用時,也會(安全的)返回一個null。所以當你用強制類型轉換時,就得用一個 try/catch結構來捕獲轉換null時的異常。用as進行轉換的時就,就只用簡單的 檢測一下轉化後的實例不為null就行了。
(譯注:被轉換對象和轉換後的 結果都有可能為null,上面就是對這兩種null進行了說明,注意區分。強制轉換 是不安全的,可能會有異常拋出,因此要用try/catch結構來保證程序正常運行 ,而as轉換是安全的,不會有異常拋出,但在轉換失敗後,其結果為null)
強制轉換與as轉換最大的區別表現在如何對待用戶定義類型的轉換。
與其它運算不一樣,as和is運算符在運行時要檢測轉換目標的類型。如 果一個指定對象不是要求轉換的類型,或者它是從要求轉換類型那裡派生的,轉 換會失敗。另一方面,強制轉換可以用轉換操作把一個對象轉換成要求的類型。 這還包括對內置數據(built-in numberic)類型的轉換。強制轉換一個long到一 個short可能會丟失數據。
同樣的問題也隱藏在對用戶定義類型的轉換上 。考慮這樣的類型:
public class SecondType
{
private MyType _value;
// other details elided
// Conversion Operator.
// This converts a SecondType to
// a MyType, see item 29.
public static implicit Operator MyType( SecondType t )
{
return t._value;
}
}
假設代碼片段中開始的Factory.GetObject()函數返回的是 SecondType 類型的數據:
object o = Factory.GetObject( );
// o is a SecondType:
MyType t = o as MyType; // Fails. o is not MyType
if ( t != null )
{
// work with t, it's a MyType.
} else
{
// report the failure.
}
// Version two:
try {
MyType t1;
t = ( MyType ) o; // Fails. o is not MyType
if ( t1 != null )
{
// work with t1, it's a MyType.
} else
{
// Report a null reference failure.
}
} catch
{
// report the conversion failure.
}