| 特性 | as | is |
|---|---|---|
| 轉換失敗結果 | 回傳 null | 回傳 false |
| 適用轉換類型 | 參考轉換、裝箱轉換 | 型別相容性檢查 (含值型別) |
| 需額外轉換碼 | 否 (直接得強型別) | 是 (需再寫一次 cast) |
| null 輸入行為 | 回傳 null | 回傳 false |
| 使用者定義轉換 | 不支援 | 不支援 |
Class2 obj2 = obj1 as Class2;
if (obj2 != null)
Console.WriteLine("轉換成功");
else
Console.WriteLine("轉換失敗,obj2 為 null");
限制:as 僅能用於參考型別或可為 null 的值型別 (int?),不可用於非可為 null 的值型別 (如 int)。
if (obj1 is Class2 obj2) // C# 7+ 型別模式,直接宣告變數
{
Console.WriteLine($"轉換成功: {obj2}");
}
else
{
Console.WriteLine("型別不相容");
}
舊版寫法需二次轉換:
if (obj1 is Class2)
{
Class2 obj2 = (Class2)obj1; // 第二次型別檢查
}
is (舊寫法):**兩次型別檢查** (一次 is,一次 cast)。as:**一次型別檢查 + 一次 null 檢查**;null 檢查極廉價 (單指令)。is (C# 7+ 型別模式):**單次檢查並宣告變數**,效能與 as 相當,且語法更優雅。建議:C# 7+ 專案優先使用
is Type var型別模式;舊版專案使用as後接 null 判斷,避免雙重轉換開銷。
as / is 避免例外拋出開銷。(Type)obj 強制轉換,失敗拋出 InvalidCastException 利於除錯。as 不支援,需用 is 或 try-cast。as 適用,常見於 obj as IDisposable。as 與 is 皆為安全型別檢查工具,as 適合「取得強型別參考或 null」,is 適合「判斷型別相容」。現代 C# (7.0+) 以 is Type var 統一兩者優點,建議優先採用。