C#中的Lambda表達式?

在C#中,?Lambda表達式?是一種比匿名方法更簡潔、更靈活的語法形式,用于定義匿名函數(Anonymous Function)。它通過=>運算符實現,能夠大幅簡化委托和表達式樹的編寫,是現代C#編程中廣泛使用的核心特性之一。


核心概念?

1、何時引入?: C# 3.0 中引入,作為匿名方法的進化版本。
2?、用途?:

  • 快速定義委托實例(如Func、Action)。
  • 構建表達式樹(Expression Trees),支持LINQ查詢等高級場景。
  • 簡化事件處理、異步編程和集合操作。

3?、特點?:

  • 語法極度簡潔,支持隱式類型推斷。
  • 可捕獲外部變量(閉包),與匿名方法行為一致。
  • 支持兩種形式:?表達式Lambda?(單行返回值)和?語句Lambda?(多行代碼塊)。

基本語法?

1. 表達式Lambda(Expression Lambda)

(參數列表) => 表達式

單行代碼,自動返回表達式結果。
?示例?:

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));  // 輸出:25

2. 語句Lambda(Statement Lambda)

(參數列表) => {// 多行代碼塊return;  // 顯式返回(如需)
}

需使用{}包裹代碼塊,顯式使用return。
?示例?:

Action<string> log = message => {Console.WriteLine($"[{DateTime.Now}] {message}");
};
log("Hello");  // 輸出帶時間戳的消息

?示例代碼?

示例1:基本委托

// 使用內置的Func委托
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3));  // 輸出:5// 顯式指定參數類型(當類型推斷不明確時)
Func<double, double, double> power = (double x, double y) => Math.Pow(x, y);

示例2:LINQ查詢

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);  // 過濾偶數
foreach (var num in evenNumbers) Console.WriteLine(num);  // 輸出2,4

示例3:閉包與外部變量

int factor = 3;
Func<int, int> multiply = x => x * factor;
Console.WriteLine(multiply(5));  // 輸出:15factor = 10;  // 閉包捕獲變量的最新值
Console.WriteLine(multiply(5));  // 輸出:50

示例4:表達式樹(高級用法)

// 將Lambda轉換為表達式樹(而非委托)
Expression<Func<int, int, int>> expr = (a, b) => a * b + 2;
var compiledExpr = expr.Compile();
Console.WriteLine(compiledExpr(3, 4));  // 輸出:14 (3*4+2)

?Lambda表達式 vs 匿名方法?

?特性?? Lambda表達式?? ?匿名方法?
?語法?? 使用 => 運算符?使用 delegate 關鍵字
?參數類型推斷?完全支持(無需顯式聲明類型)需顯式聲明或依賴上下文推斷
?返回值?表達式Lambda自動返回,語句Lambda需顯式return必須顯式使用return
?表達式樹支持?是(通過Expression)
?代碼簡潔性?更簡潔較冗長
?適用場景?現代C#代碼、LINQ、異步編程舊版代碼(C# 2.0)、需要顯式類型聲明

?高級用法與注意事項?

1、閉包陷阱?:
Lambda表達式捕獲外部變量時,與匿名方法共享相同的閉包行為。在循環中直接使用循環變量可能導致意外結果:

var actions = new List<Action>();
for (int i = 0; i < 3; i++) {actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions) action();  // 輸出3次3,而非0,1,2

解決方法?:在循環內創建臨時變量:

for (int i = 0; i < 3; i++) {int temp = i;actions.Add(() => Console.WriteLine(temp));  // 輸出0,1,2
}

2、性能優化?:

  • 頻繁調用的Lambda會導致重復的委托分配。可使用靜態Lambda(C# 9.0+)減少內存開銷:
Func<int, int> square = static x => x * x;  // 不捕獲外部變量
  • 避免在熱路徑(高頻執行代碼)中濫用閉包。

?3、與泛型方法配合?:
Lambda表達式可自動推斷泛型類型參數:

T Process<T>(T input, Func<T, T> transformer) => transformer(input);
var result = Process(10, x => x * 2);  // 自動推斷T為int

4?、異步Lambda?:
Lambda表達式支持async/await語法:

Func<Task> asyncTask = async () => {await Task.Delay(1000);Console.WriteLine("Async completed");
};

?何時使用Lambda表達式??

1?、優先使用Lambda?:

  • 需要簡潔的委托定義(如LINQ查詢、事件處理)。
  • 構建表達式樹(如Entity Framework查詢轉換)。
  • 使用現代C#特性(如異步編程、模式匹配)。
    2?、選擇匿名方法?:
  • 維護舊版C#(< 3.0)代碼。
  • 需要顯式指定參數類型且類型推斷不明確時。

總結?

Lambda表達式是C#函數式編程的核心工具,通過極簡語法和強大功能,顯著提升了代碼的可讀性和靈活性。結合閉包、表達式樹和類型推斷,它在LINQ、異步操作和高效集合處理中不可或缺。理解其底層機制(如委托分配、閉包行為)和性能影響,有助于編寫更健壯、高效的代碼。

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

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

相關文章

通信系統的性能指標

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、通信系統的性能指標概述二、數字通信系統的有效性指標三、數字通信系統的可靠性指標總結 前言 一、通信系統的性能指標概述 其中一個提高&#xff0c;另一個…

Linux:(模擬HTTP協議,GET和POST方法,Http的狀態碼)

目錄 一、認識HTTP協議 1.上網的本質 2.應用層的運行邏輯 3.HTTP的概念 二、url 1.認識網址 三、HTTP協議的宏觀理解 1.HTTP請求 2.HTTP響應 3.實際的HTTP請求 &#xff08;1&#xff09;測試代碼 &#xff08;2&#xff09;接收HTTP請求 &#xff08;3&#xff09…

動態規劃之完全背包

引言&#xff1a; 完全背包 隸屬于動態規劃中的背包問題。而 01背包 又是完全背包的基石&#xff0c;所以不懂01背包的&#xff0c;有必要了解一下。 什么是完全背包&#xff1f; 01背包問題&#xff1a;有一個背包承重為V&#xff0c;有N個物品&#xff0c;每個物品的價值(…

Codeforces Round 1003 (Div. 4)

ABCDE略 F 如果這個序列有兩個一樣的數挨著或者中間只隔一個其他的數&#xff0c;那么這個數就是多數。可以用反證法&#xff0c;構造一個多值序列無法不包含以上兩種結構。只需要在樹上找這兩種結構就可以了 #include <bits/stdc.h> #define int long long using nam…

金融數據分析(MATLAB)個人學習筆記(5):金融實證分析實例

一、國內外常用金融數據庫簡介 &#xff08;一&#xff09;國外數據庫 1. CRSP數據庫 CRSP&#xff08;Center for Research in Security Prices,證券價格研究中心&#xff09;是美國芝加哥大學商研所金融研究中心的產品。收集的美國股票和指數數據來源主要為紐約證券交易所…

硬件基礎(3):三極管(4):關于三極管的壓降

文章目錄 三極管的壓降使用與測量注意事項 三極管的壓降 三極管的“壓降”通常是指在一定工作狀態下&#xff0c;三極管不同電極之間產生的電壓差。對于常見的雙極性晶體管&#xff08;BJT&#xff09;而言&#xff0c;最常討論的壓降通常包括以下幾個部分&#xff1a; 基-發射…

[深度學習]圖像分類項目-食物分類

圖像分類項目-食物分類(監督學習和半監督學習) 文章目錄 圖像分類項目-食物分類(監督學習和半監督學習)項目介紹數據處理設定隨機種子讀取文件內容圖像增廣定義Dataset類 模型定義遷移學習 定義超參Adam和AdamW 訓練過程半監督學習定義Dataset類模型定義定義超參訓練過程 項目介…

5.go切片和map

切片的概念 數組和切片相比較切片的長度是不固定的&#xff0c;可以追加元素&#xff0c;在追加時可能會使切片的容量增大&#xff0c;所以可以將切片理解成 "動態數組"&#xff0c;但是&#xff0c;它不是數組&#xff0c;而是構建在數組基礎上的更高級的數據結構。…

在 Windows 上安裝 PowerShell 的多種方法與完整指南

原文&#xff1a;在 Windows 上安裝 PowerShell 的多種方法與完整指南 | w3cschool筆記 在 Windows 上安裝 PowerShell 有多種方式。每種安裝方法都適用于不同的場景和工作流。請選擇最適合您需求的方法。 WinGet&#xff1a;推薦在 Windows 客戶端上安裝 PowerShell 的方式MS…

云原生算力引擎:分布式推理的流體動力學

引言&#xff1a;算力黑洞的引力擾動 OpenAI推理集群日處理4.5億次請求&#xff0c;CUDA 12.3實現μs級張量切換。特斯拉Dojo超算芯片間延遲0.5ns&#xff0c;阿里巴巴PAI平臺節省58%訓練時長。HuggingFace模型庫下載量突破3億次&#xff0c;AWS Inferentia芯片能效比提升8倍。…

MySQL MVCC的快照讀和當前讀區別,Redis的RDB+AOF混合持久化流程。

MySQL MVCC 的快照讀和當前讀區別 快照讀 (Snapshot Read) 定義: 讀取數據的歷史版本&#xff08;快照&#xff09;&#xff0c;基于 MVCC&#xff08;多版本并發控制&#xff09;實現。特點: 不加鎖&#xff0c;非阻塞讀。返回事務開始時的快照數據&#xff0c;確保一致性。…

Cesium 自定義路徑導航材質

cesium 自定義路徑導航紋理圖片隨便更換&#xff0c;UI 提供設計圖片即可達到效果&#xff1b; 打開小馬的weix 關注下 搜索“技術鏈” 回復關鍵詞《《路徑》》獲取原始代碼&#xff1b; 拿到就能用輕松解決&#xff01;幫忙點個關注吧&#xff01;

3月25號

添加圖片的一些例子: // 創建一個二維數組,用來管理數據int[][] data new int[4][4]; // 記錄空白方塊的位置int x0;int y0; // 定義一個變量,記錄當前展示圖片的路徑String path"E:\\java\\jigsawgame\\路飛\\路飛"; // 加載圖片細節: // …

【機器學習】什么是支持向量機?

什么是支持向量機&#xff1f; 支持向量機&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一種強大的機器學習算法&#xff0c;常用于分類問題&#xff0c;也可以用于回歸問題。它的核心思想是通過找到一個最佳的“超平面”來將不同類別的數據分開&#xff…

10分鐘打造專屬AI助手!ToDesk云電腦/順網云/海馬云操作DeepSeek哪家強?

文章目錄 一、引言云計算平臺概覽ToDesk云電腦&#xff1a;隨時隨地用上高性能電腦 二 .云電腦初體驗DeekSeek介紹版本參數與特點任務類型表現 1、ToDesk云電腦2、順網云電腦3、海馬云電腦 三、DeekSeek本地化實操和AIGC應用1. ToDesk云電腦2. 海馬云電腦3、順網云電腦 四、結語…

Spring Boot 一個接口實現任意表的 Excel 導入導出

Java的web開發需要excel的導入導出工具&#xff0c;所以需要一定的工具類實現&#xff0c;如果是使用easypoi、Hutool導入導出excel&#xff0c;會非常的損耗內存&#xff0c;因此可以嘗試使用easyexcel解決大數據量的數據的導入導出&#xff0c;且可以通過Java8的函數式編程解…

QT原子變量:QAtomicInteger、QAtomicPointer、QAtomicFlag

引言&#xff1a;原子變量為何重要&#xff1f; 在多線程編程中&#xff0c;共享數據的原子性訪問是保證線程安全的核心。傳統互斥鎖雖然有效&#xff0c;但會帶來性能損耗和死鎖風險。QT提供的原子類型&#xff08;QAtomicInteger、QAtomicPointer、QAtomicFlag&#xff09;通…

大模型金融企業場景落地應用

一、商業銀行體系 1. 江蘇銀行 企業背景&#xff1a;江蘇銀行是總部位于江蘇南京的全國性股份制商業銀行&#xff0c;在城商行中資產規模位居前列&#xff0c;積極擁抱金融科技&#xff0c;將數字化轉型作為核心戰略之一。近年來&#xff0c;江蘇銀行持續加大在人工智能、大數…

卡特蘭數在數據結構上面的運用

原理 Catalan數是一個數列&#xff0c;其第n項表示n個不同結點可以構成的二叉排序樹的數量。Catalan數的第n項公式為&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是組合數&#xff0c;表示從2n個元素中選擇n個元素的組合數。 Catalan數的原理可以通過以下方式理解&…

影視后期工具學習之PR(中)

pr剪輯之旅----聲音設計 第五課 鏡頭語言和綠幕摳像 超級鍵效果(超級鍵通過簡單的吸管取色和參數調整,即可實現專業級摳像與合成效果。無論是綠幕替換背景,還是創意雙重曝光,都能輕松駕馭。建議結合「Alpha 通道」視圖觀察透明區域,逐步優化細節,最終導出高質量視頻。)…