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

C# 型別轉換核心:as、is 與強制轉換 (Cast) 深度解析與最佳實務

     編輯:關於C#

三種轉換方式比較

特性asis強制轉換 (Cast)
語法obj as Typeobj is Type(Type)obj
回傳值成功回傳物件,失敗回傳 null成功 true,失敗 false成功回傳物件,失敗拋 InvalidCastException
適用型別參考型別、可為 null 的實值型別所有型別所有型別 (含實值型別數值轉換)
執行使用者定義轉換否否是 (隱含/顯式運算子)
效能極快 (單指令)極快快,但失敗擲例外成本高
執行緒安全是是是

核心差異:使用者定義轉換

struct Digit
{
    public int Value;
    public static implicit operator int(Digit d) => d.Value;
    public static explicit operator Digit(int i) => new Digit { Value = i };
}

Digit d = new Digit { Value = 42 };
int i1 = (int)d;      // OK: 隱含轉換
int i2 = d as int;    // 編譯錯誤: as 不能用於實值型別 (非 nullable)
int i3 = d is int ? (int)d : 0; // OK 但多餘

// 參考型別範例
object obj = "hello";
string s1 = obj as string;      // "hello"
string s2 = (string)obj;        // "hello"
bool b = obj is string;         // true

object num = 123;
string s3 = num as string;      // null (不拋例外)
string s4 = (string)num;        // 拋 InvalidCastException

決策流程圖:該用哪一種?

  1. 需要轉換並後續使用結果 → 先用 as,再檢查 null。
    var str = obj as string;
    if (str != null) { /* 使用 str */ }
  2. 只需判斷型別、不需結果 → 用 is (C# 7+ 可用型別模式 obj is string s 合併判斷與轉換)。
  3. 確定物件即為該型別、不容許失敗 → 直接 (Type)obj,失敗即為 Bug 應拋出例外。
  4. 實值型別轉換 (int→long、double→int 等) → 必須用強制轉換,as/is 不支援 (除非 int?)。

C# 7+ 型別模式簡化寫法

// 傳統
if (obj is string)
{
    var s = (string)obj;
    Console.WriteLine(s.Length);
}

// 模式比對 (合併判斷與轉換)
if (obj is string s) // s 只在 true 區塊有效
{
    Console.WriteLine(s.Length);
}

// switch 表達式 (C# 8+)
string desc = obj switch
{
    string s => $"String: {s.Length}",
    int i => $"Int: {i}",
    null => "Null",
    _ => "Other"
};

效能微測試 (參考)

// 1 億次迴圈,Release 模式,.NET 6 x64
// as + null 檢查:     ~450 ms
// is + 型別模式:      ~460 ms
// try-cast + catch:   ~1,200 ms (例外成本極高)
// 結論: 正常路徑 as/is 差異微小,避免例外為大原則。

常見錯誤與迷思

  • 迷思: as 比 is 快 → 實測差異可忽略,選語意正確者。
  • 錯誤: int? x = obj as int? → obj 若為 long 會回傳 null 而非轉換,需用 Convert.ToInt32 或模式比對。
  • 最佳實務: 公開 API 參數驗證用 is + throw,內部邏輯用 as + null 檢查,確定型別時直 Cast。

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45592.htm

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