首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 3:優先用 is/as 而非強制轉型(四)

     編輯:關於C語言

值型別無法使用 as

object o = Factory.GetValue();
int i = o as int; // 編譯錯誤:值型別不可為 null

因為 as 失敗回傳 null,但值型別不可為 null。此時改用 is 模式比對(C# 7+):

if (o is int value)
{
    // value 直接可用,已轉型完成
    Console.WriteLine(value);
}

或傳統寫法:

if (o is int)
{
    int i = (int)o; // 安全,已經過 is 檢查
}

is 與 as 的關係

  • is:型別檢查,回傳 bool,不轉型
  • as:安全轉型,失敗回傳 null(僅限參考型別/可為 null 的值型別)
  • 兩者永不拋出例外

冗餘寫法避免

// ❌ 冗餘:as 已經包含檢查
if (o is MyType)
    t = o as MyType;

// ❌ 冗餘:重複 as 運算
if ((o as MyType) != null)
    t = o as MyType;

// ✅ 正確:單次 as + null 檢查
MyType t = o as MyType;
if (t != null) { ... }

foreach 內部使用強制轉型

foreach (MyType t in collection)
    t.DoStuff();

// 等同於:
IEnumerator e = collection.GetEnumerator();
while (e.MoveNext())
{
    MyType t = (MyType)e.Current; // 非泛型 IEnumerable 必須強制轉型
    t.DoStuff();
}

泛型 IEnumerable<T> 則無需轉型,編譯器產生型別安全程式碼。

總結決策樹

  1. 參考型別轉型 → 用 as + null 檢查
  2. 值型別轉型 → 用 is 模式比對(C# 7+)或 is + 強制轉型
  3. 使用者定義轉型運算子 → 必須用強制轉型 (T)o,as/is 忽略使用者定義轉型
  4. 確定型別正確且不想要 null 檢查 → 直接強制轉型(但建議加註解說明原因)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved