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

C# 關鍵字 as:安全型別轉換與模式比對的核心運算子

     編輯:關於C#

前言:as 是 C# 最常用的安全轉型運算子

as 運算子嘗試將運算式轉換為指定參考型別(或可為 null 的實值型別),成功回傳轉換後的參考,失敗回傳 null,**永不拋出例外**。這使其成為「試探性轉型」的首選工具,廣泛用於事件處理器、工廠模式、訪問者模式、模式比對預處理等場景。

一、語法與語意


expression as Type
  • expression:任意運算式(參考型別、可為 null 實值型別、dynamic)。
  • Type:參考型別(class/interface/delegate/array)或 Nullable<T>(int? 等)。
  • 結果型別:Type(若 Type 為非可為 null 參考型別,結果仍為可為 null)。

二、核心規則與限制

規則說明
僅限參考轉換/裝箱/解箱/可為 null 轉換不可用於使用者定義轉換、數值型別間轉換(如 int as long 編譯錯誤 CS0039)
不執行使用者定義轉換運算子僅考慮 CLR 內建參考/裝箱/可為 null 轉換
編譯期型別檢查若 expression 編譯期型別與 Type 無繼承/實作關係 → 編譯錯誤 CS0039
執行期語意等同 expression is Type ? (Type)expression : (Type)null(但只評估一次)
不可用於非可為 null 實值型別int i = 5; var x = i as int; → 錯誤,需 int?

三、經典使用場景

3.1 事件處理器中識別發送者


void OnClick(object sender, EventArgs e) {
    if (sender is Button btn) { btn.BackColor = Color.Red; } // C# 7+ 模式比對(推薦)
    // 或舊版
    var btn = sender as Button;
    if (btn != null) btn.BackColor = Color.Red;
}

3.2 工廠/策略模式中嘗試轉型


ICommand CreateCommand(object input) {
    return input switch {
        string s => new StringCommand(s),
        int i => new IntCommand(i),
        _ => throw new ArgumentException("Unsupported input type")
    };
}
// 使用 as 進行前置檢查
if (input is not null && input as IValidatable is { } validatable) {
    validatable.Validate();
}

3.3 避免雙重型別檢查(舊版 C# 模式)


// 不佳:兩次型別檢查
if (obj is MyClass) {
    var mc = (MyClass)obj; // 再次驗證
    mc.DoWork();
}

// 良好:as 單次檢查
var mc = obj as MyClass;
if (mc != null) mc.DoWork();

// 最佳(C# 7+):模式比對合併宣告與檢查
if (obj is MyClass mc2) mc2.DoWork();

3.4 介面查詢


var disposable = resource as IDisposable;
disposable?.Dispose(); // 安全呼叫,若非 IDisposable 則無操作

3.5 陣列協變性檢查


object[] arr = new string[10];
var stringArr = arr as string[]; // 成功(陣列協變性)
var intArr = arr as int[];       // null(執行期型別不符)

四、as vs is vs 強制轉型 (Type)

運算子成功結果失敗結果適用場景
as轉換後參考null不確定是否可轉換、預期失敗為正常流程
is (C# 7+ 模式)true + 宣告變數false型別檢查+立即使用、模式比對
(Type)轉換後參考拋出 InvalidCastException確信可轉換、失敗屬於程式錯誤

五、效能考量

  • as 與 is 皆為單一指令(isinst),極度輕量。
  • 避免 try/catch 包裹強制轉型(例外處理開銷巨大)。
  • 熱路徑中優先使用 is 模式比對(編譯器優化最佳)。

六、進階:as 與 null 條件運算子 ?. 組合


var length = (obj as string)?.Length; // 若 obj 非 string → null,不拋出例外
var disposed = (resource as IDisposable)?.Dispose(); // 安全釋放

七、C# 關鍵字完整分類(參考)

C# 關鍵字分為保留關鍵字(不可作識別碼)與內容關鍵字(特定語境有特殊意義,可作識別碼)。若需使用保留關鍵字作識別碼,加 @ 前綴(@class、@as)。

類別關鍵字
型別bool byte char decimal double enum float int long sbyte short string uint ulong ushort object void
修飾符abstract async const extern new override partial readonly sealed static unsafe virtual volatile
流程控制break continue do else for foreach goto if return switch try catch finally throw lock using checked unchecked
存取/命名空間public private protected internal namespace using
類別/結構/介面class struct interface delegate event enum
泛型where in out default
非同步/迭代器async await yield
查詢運算式 (LINQ)from where select group orderby join into let ascending descending by on equals
其他as is typeof nameof sizeof stackalloc ref out in params this base null true false operator implicit explicit

結語

as 運算子以「失敗回傳 null、不拋例外」的安全語意,成為 C# 型別系統中不可或缺的防禦性程式設計工具。配合 is 模式比對、?. null 條件運算子、?? null 聯合運算子,構成現代 C# 空值安全與型別安全的核心防線。掌握 as 的適用邊界(僅參考/裝箱/可為 null 轉換)、避免濫用於確定可轉換場景(改用強制轉型表達意圖),即能寫出更健壯、可讀性更高的程式碼。

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