從“Switch-case“到“智能模式“:C#模式匹配的終極進化指南

當代碼開始"思考"

你是否厭倦了層層嵌套的if-else地獄?是否想過讓代碼像偵探推理一樣優雅地解構數據?C#的模式匹配正是這樣一把瑞士軍刀,從C# 7.0到C# 12,它已悄然進化成改變編程范式的利器。

一、模式匹配的三重境界

1.1 青銅時代:Type Check(C# 7.0)

if (obj is string str)
{Console.WriteLine($"字符串長度:{str.Length}");
}
  • is表達式同時完成類型檢查和賦值

  • 告別冗長的as轉換和null檢查

1.2 白銀時代:Switch表達式(C# 8.0)

var result = shape switch
{Circle c => $"半徑{c.Radius}的圓",Rectangle { Width: var w, Height: h } when w == h => $"邊長{w}的正方形",_ => "未知形狀"
};
  • 聲明式匹配取代命令式分支

  • 屬性模式+條件判斷一氣呵成

1.3 黃金時代:遞歸模式(C# 10+)

if (person is Professor { Students: [_, .., { Name: "Alice" }] })
{Console.WriteLine("找到帶Alice的教授!");
}
  • 深度嵌套數據結構的精準打擊

  • 列表模式匹配+屬性解構

二、四大實戰黑科技

2.1 元組解構:多條件聯合判斷

var outcome = (statusCode, errorMessage) switch
{(200, _) => "成功",(404, "Not Found") => "資源丟失",(500, string msg) when msg.Contains("timeout") => "超時錯誤",_ => "未知錯誤"
};

2.2 性能優化:避免裝箱的秘訣

public static bool IsLetter(this char c) =>c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');
// 直接操作Unicode值,無需轉換為字符串

2.3 動態類型終結者

string Describe(object obj) => obj switch
{int i => $"整數{i}",DateTime dt => dt.ToString("yyyy-MM-dd"),IEnumerable<int> numbers => $"數字序列,總和:{numbers.Sum()}",_ => "其他類型"
};

2.4 自定義模式匹配器

public static class Extensions
{public static bool IsPrime(this int n) => n > 1 && Enumerable.Range(2, (int)Math.Sqrt(n)-1).All(i => n % i != 0);
}// 使用
var result = number switch
{int x when x.IsPrime() => "質數",_ => "非質數"
};

三、模式匹配的五個"不要"

3.1 不要忽視順序陷阱

case int i when i > 10: // 這個分支永遠不會觸發
case int i: 
case > 10: // C# 11關系模式要放在前面

3.2 不要濫用var模式

if (obj is var temp) // 總是匹配成功!可能引入隱蔽bug

3.3 不要忘記窮盡性檢查

// 開啟編譯器警告
#nullable enable
switch (nullableValue)
{case string s: ... // 缺少null處理分支會觸發CS8509警告
}

3.4 不要忽視性能代價

高頻調用時優先考慮多態而非模式匹配

3.5 不要混淆聲明空間

if (e is { X: > 0, Y: var y1 }) 
{ int y2 = y1; // 正確 
}
// y1在此處不可見,作用域僅限于模式

四、與類型系統的靈魂共鳴

4.1 記錄類型(Record)的完美搭檔

public record Order(int Id, List<Item> Items);var discount = order switch
{{ Items.Count: > 10 } => 0.2m,{ Items: [{ Price: > 100 }, ..] } => 0.1m,_ => 0
};

4.2 解構函數+位置模式

public readonly struct Point(int x, int y)
{public void Deconstruct(out int X, out int Y) => (X, Y) = (x, y);
}var quadrant = point switch
{( > 0, > 0 ) => 1,( < 0, > 0 ) => 2,( < 0, < 0 ) => 3,( > 0, < 0 ) => 4,_ => 0
};

五、未來展望:C# 12模式匹配新紀元

5.1 列表模式增強

if (list is [var first, .. var middle, var last])
{// 輕松獲取首尾元素
}

5.2 Span模式匹配優化

ReadOnlySpan<char> span = "12345";
if (span is ['1', .., '5'])
{// 高性能內存操作
}

當模式匹配遇上現代C#,代碼不再是冰冷的指令集,而成為描述業務邏輯的詩篇。它帶來的不僅是語法的簡化,更是思維方式的升級——從"怎么做"到"是什么"的范式轉變。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70882.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

組件注冊方式、傳遞數據

組件注冊 一個vue組件要先被注冊&#xff0c;這樣vue才能在渲染模版時找到其對應的實現。有兩種注冊方式&#xff1a;全局注冊和局部注冊。&#xff08;組件的引入方式&#xff09; 以下這種屬于局部引用。 組件傳遞數據 注意&#xff1a;props傳遞數據&#xff0c;只能從父…

ROS的action通信——實現階乘運算(三)

在ROS中除了常見的話題(topic&#xff09;通信、服務(server)通信等方式&#xff0c;還有action通信這一方式&#xff0c;由于可以實時反饋任務完成情況&#xff0c;該通信方式被廣泛運用于機器人導航等任務中。本文將通過三個小節的分享&#xff0c;實現基于action通信的階乘運…

四款 AI 協作辦公工具,AI工具庫革新辦公效率

在數字化辦公時代&#xff0c;AI 技術正深刻改變著我們的工作方式。AIDH.NETAI工具庫匯聚了眾多先進的工具&#xff0c;今天我們來了解 AI協作辦公工具&#xff0c;探索它們如何助力企業和團隊在辦公場景中脫穎而出。 Taskade&#xff1a;智能工作流的領航者 Taskade 是一款將…

vue2 h5 畫高德地圖電子圍欄

使用前請先申請高德地圖key JavaScript API | 騰訊位置服務 npm install lodash-es效果圖 子組件代碼 <template><div class"fence-container"><div v-if"loading" class"map-loading"><div class"loader">…

unity學習54:圖片+精靈+遮罩mask,舊版文本 text 和新的TMP文本

目錄 1 圖片 image 1.1 如果直接導入image 1.2 圖片 image 和精靈 sprite 1.2.1 繼續修改上面的格式 texture type 是default 1.2.2 再次關聯到UI的 image 物體上就可以了 1.3 圖片和遮罩 mask 1.3.1 創建1個父物體和1個子物體&#xff0c;分別都是image 1.3.2 如果父…

Spring Data JPA vs MyBatis:ORM框架如何選擇?

在選擇ORM框架時&#xff0c;Spring Data JPA和MyBatis是兩個常見的選擇&#xff0c;它們各有優缺點&#xff0c;適用于不同的場景。以下是兩者的對比&#xff0c;幫助你做出選擇&#xff1a; 1. Spring Data JPA 優點&#xff1a; 開發效率高&#xff1a;通過簡單的接口定義和…

Selenium 與 Coze 集成

涵蓋兩者的基本概念、集成步驟、代碼示例以及相關注意事項。 基本概念 Selenium:是一個用于自動化瀏覽器操作的工具集,支持多種瀏覽器(如 Chrome、Firefox 等),能夠模擬用戶在瀏覽器中的各種操作,如點擊、輸入文本、選擇下拉框等,常用于 Web 應用的自動化測試。Coze:它…

在線騎行|基于SpringBoot的在線騎行網站設計與實現(源碼+數據庫+文檔)

在線騎行網站系統 目錄 基于SpringBoot的在線騎行設計與實現 一、前言 二、系統設計 三、系統功能設計 5.1用戶信息管理 5.2 路線攻略管理 5.3路線類型管理 5.4新聞賽事管理 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取…

[深度學習]基于C++和onnxruntime部署yolov12的onnx模型

基于C和ONNX Runtime部署YOLOv12的ONNX模型&#xff0c;可以遵循以下步驟&#xff1a; 準備環境&#xff1a;首先&#xff0c;確保已經下載后指定版本opencv和onnruntime的C庫。 模型轉換&#xff1a; 安裝好yolov12環境并將YOLOv12模型轉換為ONNX格式。這通常涉及使用深度學習…

Imagination DXTP GPU IP:加速游戲AI應用,全天候暢玩無阻

日前&#xff0c;Imagination 推出了最新產品——Imagination DXTP GPU IP&#xff0c;在智能手機和其他功耗受限設備上加速圖形和AI工作負載時&#xff0c;保證全天候的電池續航。它是我們最新D系列GPU的最終產品&#xff0c;集成了自2022年發布以來引入的一系列功能&#xff…

(python)Arrow庫使時間處理變得更簡單

前言 Arrow庫并不是簡單的二次開發,而是在datetime的基礎上進行了擴展和增強。它通過提供更簡潔的API、強大的時區支持、豐富的格式化和解析功能以及人性化的顯示,填補了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期時間處理方式,Arrow庫是一個不錯的選擇…

pandas中的數據結構+數據查詢

pandas 數據結構 Series Series是一種類似于一維數組的對象&#xff0c;它由一組數據&#xff08;不同數據類型&#xff09;以及一組與之相關的數據標簽&#xff08;即索引&#xff09;組成。 列表創建 僅有數據列表即可產生最簡單的Series s1 pd.Series([1,a,5.2,7]) 左側…

使用前端 html css 和js 開發一個AI智能平臺官網模板-前端靜態頁面項目

最近 AI 人工智能這么火&#xff0c;那必須針對AI 做一個 AI方面的 官方靜態網站練手。讓自己的前端技術更上一層樓&#xff0c;哈哈。 隨著人工智能技術的不斷發展&#xff0c;越來越多的AI應用開始滲透到各行各業&#xff0c;為不同領域的用戶提供智能化解決方案。本網站致力…

React + TypeScript 數據模型驅動數據字典生成示例

React TypeScript 數據模型驅動數據字典生成示例 引言&#xff1a;數據字典的工程價值 在現代化全棧開發中&#xff0c;數據字典作為業務實體與數據存儲的映射橋梁&#xff0c;直接影響系統可維護性與團隊協作效率。傳統手動維護字典的方式存在同步成本高和版本管理混亂兩大痛…

MySQL八股整理

1. 如何定位慢查詢&#xff1f; 慢查詢一般發生在聯表查詢或者表中數據量較大時&#xff0c;當響應時間較長或者壓測時間超過2s時&#xff0c;就認為是慢查詢。定位慢查詢的話一般有兩種方法&#xff0c;一種是使用專門的分析工具去定位。另一種也是我們項目中之前使用過的方法…

ShardingSphere Proxy 配置

在使用 ShardingSphere Proxy 模式時&#xff0c;結合 主從復制架構 實現 讀寫分離&#xff0c;并按照 用戶ID哈希算法 確定庫、時間范圍 確定表的場景下&#xff0c;配置文件需要做一些調整以支持分片、讀寫分離以及主從復制。 以下是如何配置 ShardingSphere Proxy 模式的詳…

Redis集群機制及一個Redis架構演進實例

Replication&#xff08;主從復制&#xff09; Redis的replication機制允許slave從master那里通過網絡傳輸拷貝到完整的數據備份&#xff0c;從而達到主從機制。為了實現主從復制&#xff0c;我們準備三個redis服務&#xff0c;依次命名為master&#xff0c;slave1&#xff0c;…

Qt QScrollArea 總結

Qt QScrollArea 總結 1. 功能概述 滾動容器&#xff1a;用于顯示超出視口&#xff08;Viewport&#xff09;范圍的內容&#xff0c;自動提供滾動條。子部件管理&#xff1a;可包裹單個子部件&#xff08;通過 setWidget()&#xff09;&#xff0c;當子部件尺寸 > 視口時&a…

Windows系統編程項目(一)進程管理器

本項目將通過MFC實現一個進程管理器&#xff0c;如下圖詳細信息頁所示&#xff1a; 一.首先創建一個基于對話框的MFC項目&#xff0c;在靜態庫中使用MFC 二.在項目默認的對話框中添加一個列表 三.列表添加變量 四.初始化列表 1.設置列表風格和表頭 2.填充列表內容 我們需要在…

RAG-202502

目錄 RAG場景的坑知識等級金字塔 初級RAG存在的問題高級RAG索前優化檢索優化檢索后優化 優化經驗總結參考 RAG場景的坑 晦澀的專業術語 誤區&#xff1a;在專業領域中。許多文獻和資料中充滿了專業術語&#xff0c;這些術語對于非專業人士&#xff08;甚至是大模型&#xff0…