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

C# as 與 is 關鍵字深度解析:安全轉型的最佳實踐

     編輯:關於C語言

為什麼不再推薦傳統強制轉型?

object obj = new MyType();
MyType val = (MyType)obj; // 失敗拋 InvalidCastException

需包 try-catch,效能差、程式碼雜訊多。

as 操作符:參考型別的安全轉型

MyType val = obj as MyType; // 失敗回傳 null,不拋例外

特性:

  • 僅限參考型別或可為 null 的實值型別。
  • 不會建立新物件,僅做型別檢查與指標調整。
  • 失敗回傳 null,必須檢查後再使用。
if (val != null) { /* 安全使用 */ }

限制與替代方案

情境as 適用?替代做法
類別之間無繼承關係❌ 編譯錯誤傳統強制轉型 + 實作 explicit operator
實值型別 (int、struct 等)❌ 編譯錯誤先 is 判斷,再強制轉型

is 操作符:型別檢查與模式比對

if (obj is int i) { Console.WriteLine(i); } // C# 7+ 模式比對

舊版寫法:

if (obj is int) { int i = (int)obj; }

決策速查表

來源 → 目標建議方式
object → 已知參考型別as + null 檢查
object → 已知實值型別is 判斷 + 強制轉型
參考型別 → 無關參考型別實作 explicit operator + 強制轉型
實值型別 → 實值型別Convert 靜態方法

實戰範例:Stream 轉型

using (var fs = new FileStream(@"d:\log.txt", FileMode.Create))
{
    object obj = fs;
    // 隱式轉型:object → Stream
    Stream s = obj as Stream;
    if (s != null) Console.WriteLine("Stream 轉型成功");

    // 顯式轉型:object → FileStream (需 is 確認)
    if (obj is FileStream ffs) Console.WriteLine("FileStream 轉型成功");
}

總結

  • as:參考型別首選,零例外、高效能。
  • is:型別檢查、模式比對、實值型別轉型前置檢查。
  • 避免舊式 try-catch 包裹強制轉型,提升可讀性與效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved