c#Lambda 表達式與事件核心知識點整理

一、Lambda 表達式

1. 概念 Lambda 表達式是一種匿名函數(無名稱的函數),簡化了委托和匿名方法的寫法,格式為: (參數列表) => 表達式或語句塊 它可以作為參數傳遞,或賦值給委托類型變量。

2. 基本語法與簡寫規則

形式說明示例
完整形式帶參數類型、大括號和 return(int a, int b) => { return a + b; }
省略參數類型編譯器自動推斷參數類型(a, b) => { return a + b; }
單參數省略括號只有一個參數時,可省略()a => { return a * 2; }
單表達式省略大括號函數體只有一句表達式時,省略{}returna => a * 2(自動返回結果)

3. 應用場景

  • 作為委托參數傳遞(如集合查詢、事件處理)

  • 簡化匿名方法的編寫

  • 配合Func/Action等內置委托使用

示例:集合查詢

int[] numbers = { 19, 20, 3, 18, 30 };
// 查找第一個偶數(使用Lambda作為查詢條件)
int firstEven = Array.Find(numbers, v => v % 2 == 0); 

4. 與托的關聯 Lambda 表達式需賦值給委托類型變量(如Func/Action)才能調用:

// Func<參數類型, 返回值類型>:帶返回值的委托
Func<int, int, int> add = (a, b) => a + b;
int result = add(2, 3); // 結果:5
?
// Action<參數類型>:無返回值的委托
Action<string> print = msg => Console.WriteLine(msg);
print("Hello Lambda"); // 輸出:Hello Lambda
二、事件(Event)

1. 概念 事件是一種特殊的多播委托,用于實現發布 - 訂閱模式,允許對象在特定行為發生時通知其他對象。

  • 發布者:定義事件并觸發它的類

  • 訂閱者:注冊事件并提供處理方法的類

2. 核心特性

  • 基于委托實現,通常使用EventHandlerEventHandler<TEventArgs>

  • 只能在聲明它的類內部觸發(調用Invoke

  • 外部只能通過+=(訂閱)和-=(取消訂閱)操作

  • 本質是 “安全的委托”,防止外部隨意修改或觸發

3. 基本用法

步驟代碼示例
定義事件public event EventHandler MyEvent;
訂閱事件MyEvent += EventHandlerMethod;(可綁定命名方法、匿名委托或 Lambda)
觸發事件MyEvent?.Invoke(sender, e);(需先檢查是否有訂閱者)

4. 事件處理程序的簽名 必須與事件委托的簽名匹配(以EventHandler為例):

// 方法參數:事件源(sender)和事件數據(e)
void EventHandlerMethod(object sender, EventArgs e)
{// 處理邏輯
}

5. 多播特性 一個事件可以綁定多個處理方法,觸發時按綁定順序依次執行:

// 綁定多個處理方法
MyEvent += Method1;
MyEvent += Method2;
MyEvent += (s, e) => Console.WriteLine("Lambda處理");
?
// 觸發時依次執行Method1 → Method2 → Lambda表達式
MyEvent?.Invoke(this, EventArgs.Empty);
三、Lambda 與事件的結合使用

Lambda 表達式可簡化事件處理程序的綁定:

// 定義事件
public event EventHandler ButtonClick;
?
// 使用Lambda綁定事件處理
ButtonClick += (sender, e) => 
{Console.WriteLine("按鈕被點擊了");
};
?
// 觸發事件
ButtonClick?.Invoke(this, EventArgs.Empty);

總結

  • Lambda 表達式:簡化匿名函數的編寫,常用于簡化委托參數,配合Func/Action使用。

  • 事件:基于委托的發布 - 訂閱機制,提供安全的跨對象通信,外部只能訂閱 / 取消訂閱,內部觸發。

  • 兩者結合:使用 Lambda 可快速編寫事件處理邏輯,減少代碼冗余。

以下是 C# 中 Lambda 表達式的常見用法和示例表格,涵蓋基本語法、場景及說明:

類型語法格式示例代碼說明
無參數() => 表達式() => Console.WriteLine("Hello")無輸入參數,執行單一表達式或語句塊
單參數參數 => 表達式x => x * 2單個參數可省略括號,表達式返回計算結果
多參數(參數1, 參數2) => 表達式(a, b) => a + b多個參數需用括號包裹,用逗號分隔
語句塊參數 => { 語句; }n => { if (n > 0) return "正"; else return "負"; }復雜邏輯需用{}包裹,需顯式使用return返回值
委托匹配與委托簽名一致Func<int, bool> isEven = x => x % 2 == 0;匹配Func<int, bool>委托(輸入 int,返回 bool)
事件處理簡化事件訂閱button.Click += (s, e) => Console.WriteLine("Clicked");替代傳統的事件處理方法,簡化代碼
LINQ 篩選結合Where方法var adults = people.Where(p => p.Age >= 18);在 LINQ 中用于定義篩選條件,p代表集合中的每個元素
LINQ 投影結合Select方法var names = people.Select(p => p.Name);提取元素的特定屬性,轉換為新的序列
排序條件結合OrderBy方法var sorted = numbers.OrderBy(n => n);定義排序依據,此處按元素本身升序排序
匿名類型創建生成匿名對象people.Select(p => new { p.Name, AgeGroup = p.Age / 10 * 10 })在 LINQ 中創建匿名類型,包含指定字段(如NameAgeGroup
閉包捕獲變量訪問外部變量int threshold = 10; var filtered = list.Where(x => x > threshold);可訪問 Lambda 表達式外部的變量(threshold),形成閉包
異步 Lambda結合async/awaitasync () => await HttpClient.GetAsync("https://example.com")async修飾,內部可使用await,返回TaskTask<T>

關鍵特性說明:

  1. 簡潔性:相比匿名方法,語法更簡潔,省略了delegate關鍵字和參數類型(編譯器自動推斷)。

  2. 類型推斷:參數類型通常可省略,編譯器會根據上下文(如委托類型、LINQ 方法)自動推斷。

  3. 不可變性:Lambda 表達式本身是匿名函數,無法直接調用,需賦值給委托類型(如FuncAction)或作為方法參數傳遞。

  4. 閉包特性:能捕獲并訪問外部作用域的變量,變量的生命周期會被延長至 Lambda 表達式使用完畢。

  5. 適用場景:主要用于簡化委托調用、事件處理、LINQ 查詢、異步操作等場景,減少代碼冗余。

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

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

相關文章

Springboot+Layui英語單詞學習系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBootLayUI框架持久層框架MyBaits成功系統案例&#xff1a;參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸…

主要分布于內側內嗅皮層的層Ⅲ的邊界向量細胞(BVCs)對NLP中的深層語義分析的積極影響和啟示

邊界向量細胞&#xff08;Boundary Vector Cells, BVCs&#xff09;主要分布于內側內嗅皮層&#xff08;MEC&#xff09;層Ⅲ&#xff0c;通過編碼環境邊界&#xff08;如墻壁、障礙物&#xff09;的距離和方向信息&#xff0c;為空間導航提供幾何參考框架。這一神經機制對自然…

Selenium是解決了什么問題的技術?

Selenium 是一種用于自動化瀏覽器操作的技術&#xff0c;主要解決了以下問題&#xff1a;1. 自動化測試 Selenium 最初是為了解決 Web 應用程序的自動化測試 問題而設計的。它可以幫助開發者和測試人員&#xff1a; 模擬用戶操作&#xff1a;如點擊按鈕、填寫表單、選擇下拉菜單…

JavaSE知識點(2)

目錄 訪問修飾符的區別 this關鍵字的作用 抽象類和接口有什么區別 抽象類可以定義構造方法嗎 但是接口不可以定義構造方法 Java支持多繼承嗎 接口可以多繼承嗎 繼承和抽象的區別&#xff1f; 抽象類和普通類的區別 成員變量和局部變量的區別&#xff1f; staic關鍵字…

(實用教程)Linux操作系統(二)

centos配置靜態ip 注意&#xff1a; 1.系統中的網關要與虛擬機編輯器中的網關保持一致 2.如果配置虛擬機編輯器后發現ping不通外網的時候&#xff0c;就要還原默認設置再進行配置 總結&#xff1a; 虛擬機編輯器需要配置ip&#xff0c;網關&#xff0c;其中ip網段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例實現

ThinkPHP8集成RabbitMQ的完整案例實現一、安裝依賴&#xff1a;需通過Composer安裝php-amqplib庫?二、配置RabbitMQ三、生產者1、發送一個郵件&#xff0c;將任務發送到RabbitMQ隊列中。2、運行結果展示四、啟動消費者&#xff1a;命令行執行php think rabbitmq:consumer1&…

解密負載均衡:如何輕松提升業務性能

什么是負載均衡 負載均衡&#xff1a;Load Balance&#xff0c;簡稱LB&#xff0c;是一種服務或基于硬件設備等實現的高可用反向代理技術&#xff0c;負載均衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備&#xff0c;從而提高了 公司業務的…

mac neo4j install verifcation

本文使用conda環境安裝&#xff0c;neo4j所依賴jdk也采用conda install的方式安裝。 1 neo4j下載 點擊如下鏈接&#xff0c;選擇community, Linux/Mac Executor&#xff0c;點擊Download Community。 本文下載的安裝包是 neo4j-community-2025.06.2-unix.tar.gz 2 安裝neo4j …

【Oracle】Oracle分區表“排雷“指南:當ORA-14400錯誤找上門時如何優雅應對

引言&#xff1a;分區表里的"定時炸彈"凌晨三點的機房&#xff0c;你盯著屏幕上刺眼的ORA-14400: 插入的分區鍵值超出所有分區范圍錯誤&#xff0c;后背發涼。這個錯誤就像埋在分區表里的定時炸彈&#xff0c;一旦觸發就會讓整個應用癱瘓。但別慌&#xff01;本文將帶…

設計模式(十四)行為型:職責鏈模式詳解

設計模式&#xff08;十四&#xff09;行為型&#xff1a;職責鏈模式詳解職責鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于將多個處理對象&#xff08;處理器&#xff09;連接成一條鏈&am…

WAIC 2025 熱點解讀:如何構建 AI 時代的“視頻神經中樞”?

一、&#x1f310; WAIC 2025 大會看點&#xff1a;AI 正在“長出眼睛與身體” 在 2025 年的人工智能大會&#xff08;WAIC 2025&#xff09;上&#xff0c;“大模型退幕后&#xff0c;具身智能登場”成為最具共識的趨勢轉向。從展區到主論壇&#xff0c;再到各大企業發布的新…

OpenCV+Python

安裝 OpenCV&#xff1a; Python&#xff1a;直接 pip install opencv-python&#xff08;核心庫&#xff09;和 opencv-contrib-python&#xff08;擴展功能&#xff09;。 pip install opencv-python pip install opencv-contrib-python 驗證安裝&#xff1a; import cv2…

現代C++的一般編程規范

一般情況下不要使用std::endl&#xff0c;尤其是在循環中&#xff0c;因為可能一開始你只是想要打印一個換行符&#xff0c;但是"endl"做的更多&#xff0c;其還會刷新緩沖區&#xff0c;這會額外花費很多時間&#xff0c;相反&#xff0c;只需要使用“\n"&…

38.安卓逆向2-frida hook技術-過firda檢測(三)(通過SO文件過檢測原理)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

創建屬于自己的github Page主頁

安裝手冊 安裝手冊 環境要求 Node.js version 18.0 安裝 Node.js 時&#xff0c;建議勾選所有和依賴相關的選項。 安裝步驟 安裝 Docusaurus 最簡單的方法是使用 create-docusaurus 命令行工具&#xff0c;它可以幫助你快速搭建一個 Docusaurus 網站的基礎框架。 你可以在…

Unity Catalog與Apache Iceberg如何重塑Data+AI時代的企業數據架構

在2025年DataAI Summit上&#xff0c;Databricks發布了一系列重大更新&#xff0c;標志著企業數據治理進入新階段。其中&#xff0c;Unity Catalog的增強功能和對Apache Iceberg的全面支持尤為引人注目。這些更新不僅強化了跨平臺數據管理能力&#xff0c;還推動了開放數據生態…

雨季,汽車經常跑山區,該如何保養?

雨季來臨&#xff0c;山區道路變得濕滑難行&#xff0c;頻繁穿梭于此的汽車面臨著前所未有的挑戰。如何在這樣惡劣的環境中確保愛車安然無恙&#xff1f;本文將為你詳細解析雨季經常跑山區的汽車該如何保養&#xff0c;讓你在遭遇突發狀況時也能從容應對。當雨季遇上山區路況&a…

Spring Boot音樂服務器項目-查詢音樂模塊

一、項目架構概覽 該音樂播放服務器采用經典的MVC分層架構&#xff0c;核心模塊包括&#xff1a; 實體層&#xff1a;定義數據模型Mapper層&#xff1a;數據庫操作接口Controller層&#xff1a;HTTP請求處理工具層&#xff1a;加密、響應封裝等輔助功能 項目核心功能包括用戶…

Imagine:高效免費的圖片壓縮工具

很多時候&#xff0c;我們需要對圖片進行壓縮&#xff0c;卻苦于找不到免費又好用的工具。這里給大家推薦一款電腦端的圖片壓縮軟件——Imagine。 Imagine文末獲取 它有諸多優點&#xff1a; 開源免費&#xff1a;無需擔心付費問題&#xff0c;完全免費使用。 便捷易用&#…

《Uniapp-Vue 3-TS 實戰開發》自定義年月日時分秒picker組件

目前組件: 組件完整代碼: <template><view><picker mode="multiSelector" :value="multiIndex" :range="multiRange" @change="onMultiChange"><view class="picker">{{ formattedDateTime }}&l…