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

.NET 型別轉換利器:is 與 as 運算子深度比較與最佳實踐

     編輯:關於C#

背景:型別安全與轉換風險

.NET 所有型別繼承自 object,透過 GetType() 可取得確切型別。但將基類參考轉為衍生類別(向下轉型)時,若物件實際型別不符,直接轉型會拋出 InvalidCastException。is 與 as 提供安全檢查機制。

is 運算子:型別相容性檢查

object o = "hello";
if (o is string s) { // C# 7+ 型別模式,直接宣告變數
    Console.WriteLine(s.Length);
}
// 等同舊寫法:
if (o is string) {
    string s = (string)o; // 第二次檢查
}
  • 回傳 bool,永不拋出例外
  • null is T 永遠為 false
  • 適用於「只需判斷、不需取值」的情境

as 運算子:安全轉型並取值

object o = "hello";
string s = o as string; // 相容則轉型,否則回傳 null
if (s != null) {
    Console.WriteLine(s.Length);
}
  • 相容回傳轉型結果,不相容回傳 null(僅限參考型別或可為 null 的實值型別)
  • 同樣不拋出例外
  • 後續若直接取值 s.Length 而未檢查 null,會拋 NullReferenceException

效能與選擇指南

場景建議理由
只需判斷型別is語意清晰,JIT 可優化
需取值並後續使用as + null 檢查單次型別檢查,避免雙重轉型
模式比對is T var (C# 7+)語法糖,合併判斷與宣告
實值型別轉換Nullable<T> + as實值型別不可直接用 as

常見錯誤與避坑

  • int i = o as int; ❌ 編譯錯誤:實值型別不可為 null
  • var x = o as string; x.Trim(); ❌ 若 o 非字串,x 為 null,拋 NullReferenceException
  • 濫用 as 掩蓋設計錯誤:若轉型失敗代表邏輯錯誤,應讓 InvalidCastException 冒出,而非靜默失敗

總結

is 適合守衛條款;as 適合「試著轉型、失敗則走替代流程」。現代 C# 搭配模式比對(is T v、switch 運算式)可寫出更簡潔安全的程式碼。

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