1. 模式匹配概述??
模式匹配是C# 7.0引入的機制,用于檢查數據的類型、值或結構,并提取信息。通過is
表達式、switch
語句/表達式實現,顯著簡化條件邏輯,提升代碼可讀性和安全性。
??核心優勢??:
- ??簡潔性??:減少冗余的類型檢查和轉換代碼。
- ??安全性??:編譯時檢查模式有效性(如屬性是否存在)。
- ??表達力??:支持嵌套、遞歸和邏輯組合模式。
??2. 核心模式類型與語法??
??(1) 類型模式(Type Pattern)??
- ??用途??:檢查對象是否為指定類型,并提取變量。
- ??語法??:
if (obj is string s) { Console.WriteLine(s.Length); }
- 直接使用
s
無需顯式轉換,作用域限于條件塊內。
- 直接使用
??(2) 常量模式(Constant Pattern)??
- ??用途??:匹配常量值(如數值、字符串、
null
)。 - ??語法??:
if (value is 42) { /* 匹配數值 */ } if (text is null) { /* 匹配空值 */ } if (input is not null) { /* 非空檢查 */ } // C# 9.0+[1,6](@ref)
??(3) 屬性模式(Property Pattern, C# 8.0+)??
- ??用途??:根據對象屬性值匹配。
- ??語法??:
if (person is { Age: >= 18, Name: "Alice" }) { /* 匹配年齡≥18且名為Alice */ }
??(4) 元組與位置模式(Tuple & Positional Pattern)??
- ??用途??:解構元組或對象(需實現
Deconstruct
方法)。 - ??語法??:
var point = (x: 0, y: 1); if (point is (0, 1)) { /* 匹配坐標 */ } if (pt is (var x, >0) && x == y) { /* 解構并匹配 */ }[
??(5) 列表模式(List Pattern, C# 11+)??
- ??用途??:匹配數組或列表的元素序列。
- ??語法??:
if (numbers is [1, 2, .. var rest]) { /* 匹配前兩個元素并捕獲剩余 */ }
??(6) 邏輯模式(Logical Pattern, C# 9.0+)??
- ??用途??:使用
and
、or
、not
組合條件。 - ??語法??:
if (num is >10 and <20 or 42) { /* 數值范圍或等于42 */ }
??3. 主要應用場景??
??(1) 替代類型檢查與轉換??
// 傳統寫法
if (shape is Circle) { var c = (Circle)shape; }
// 模式匹配寫法
if (shape is Circle c) { Console.WriteLine(c.Radius); }
??(2) 簡化復雜條件邏輯??
string TaxCategory(IncomeData data) => data switch { { Income: <10000 } => "低收入", { Income: >=10000 and <50000, IsCitizen: true } => "中等收入公民", _ => "其他"
}
??(3) 處理嵌套對象??
if (student is { Address.City: "Beijing" }) { /* 匹配嵌套屬性 */ }
??4. 版本支持與最佳實踐??
- ??版本演進??:
- C# 7.0:基礎類型、常量模式。
- C# 8.0:屬性模式、遞歸模式、
switch
表達式。 - C# 9.0:邏輯模式(
and
/or
/not
)。 - C# 11:列表模式、切片模式。
- ??最佳實踐??:
- 優先使用
switch
表達式替代多重if-else
。 - 結合
not null
避免空引用異常。 - 對復雜結構使用遞歸模式提升可讀性。
- 優先使用
??5. 模式匹配 vs.?if
語句??
??特性?? | ??模式匹配?? | ??if 語句?? |
---|---|---|
??簡潔性?? | 高(減少冗余代碼) | 低(需顯式類型檢查) |
??可讀性?? | 高(邏輯直觀) | 嵌套復雜時較差 |
??適用場景?? | 復雜條件、類型檢查 | 簡單條件判斷 |
??類型安全?? | 編譯時檢查 | 需手動處理轉換異常 2 5 |
參考:
- C#模式匹配詳解
- 再聊 C# 里的模式匹配,10個常用方法總結
- 模式匹配概述
- C# 模式匹配及常見形式