.NET 所有型別繼承自 object,透過 GetType() 可取得確切型別。但將基類參考轉為衍生類別(向下轉型)時,若物件實際型別不符,直接轉型會拋出 InvalidCastException。is 與 as 提供安全檢查機制。
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 永遠為 falseobject 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; ❌ 編譯錯誤:實值型別不可為 nullvar x = o as string; x.Trim(); ❌ 若 o 非字串,x 為 null,拋 NullReferenceExceptionas 掩蓋設計錯誤:若轉型失敗代表邏輯錯誤,應讓 InvalidCastException 冒出,而非靜默失敗is 適合守衛條款;as 適合「試著轉型、失敗則走替代流程」。現代 C# 搭配模式比對(is T v、switch 運算式)可寫出更簡潔安全的程式碼。