程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則3:選擇is或者as操作符而不是做強制類型轉換(2)

Effective C#原則3:選擇is或者as操作符而不是做強制類型轉換(2)

編輯:關於C語言

你會同意第一種寫法更簡單更容易讀。它沒有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.
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved