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

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

     編輯:關於C語言

強制轉型與 as 的核心差異:使用者定義轉型

as/is 只檢查執行時型別是否為目標型別或其衍生型別,忽略使用者定義轉型運算子。
強制轉型 (T)o 則會呼叫使用者定義的 implicit/explicit operator。

示範:使用者定義隱含轉型

public class SecondType
{
    private MyType _value;
    public static implicit operator MyType(SecondType t) => t._value;
}

// 測試
object o = Factory.GetObject(); // 回傳 SecondType 實例

// as 失敗:o 不是 MyType,也非 MyType 衍生類
MyType t1 = o as MyType; // null

// 強制轉型成功:呼叫 implicit operator
MyType t2 = (MyType)o;   // 回傳 t._value

實務決策

情境建議
標準繼承體系,要安全轉型as + null 檢查
型別有使用者定義轉型運算子強制轉型 (T)o(配合 try/catch)
值型別拆箱is 模式比對 / is + 強制轉型
不確定是否有使用者定義轉型優先 as,失敗再考慮強制轉型

try/catch vs as/null 檢查效能

as 失敗只回傳 null,零例外開銷。強制轉型失敗拋 InvalidCastException,例外處理成本極高(微秒級)。高頻呼叫路徑必須用 as/is。

null 語意區別

  • 來源為 null:as 回傳 null,強制轉型也回傳 null(參考型別)
  • 型別不符:as 回傳 null,強制轉型拋例外

用 as 時,null 結果合併了兩種情況,若需區別請先檢查 o == null。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved