C# 委托——lambda

lambda表達式不簡化寫起來和匿名函數很像,而匿名函數通常賦值給委托,通過委托進行調用。以下我們對lambda和委托的基本規則與使用進行整理,同時為了加深理解和記憶,我們整理了委托是如何一步步演化到lambda。

1. 委托

委托是一個可以指向方法的類型,調用委托變量時,執行的就是變量指向的方法,以下介紹的是委托的基本用法。

1.1 自定義委托

委托的定義與類不同,更像是C中的函數指針聲明。定義一個委托要注意以下幾點:

  • 最重要的是要做到類型兼容:
    • 參數列表(參數個數,參數數據類型)一致
    • 返回值數據類型一致
      在這里插入圖片描述
  • 注意定義委托的位置,因為委托和類是平級關系,所以通常把委托聲明在名稱空間體里面;
namespace ConsoleApp3
{//定義委托delegate double Calc(double x, double y);internal class Program{//定義方法public static double Add(double x, double y){ return x + y;}static void Main(string[] args){//使用委托Calc calc = Add;Console.WriteLine(calc(1.2, 8.8));Console.Read();}}
}

使用委托時還應注意:

  • 上面例子中:Calc calc = Add;,這里要注意傳入方法時不能帶括號,帶括號表示調用
  • 既然委托的本質也是類,同樣可以new一個實例:Calc calc = new Calc(Add);

1.2 泛型委托

自定義泛型委托

<> 內是類型參數列表,用于替換使用的返回值以及參數列表中的參數類型;

namespace ConsoleApp3
{delegate T AddDele<T>(T a, T b);internal class Program{static void Main(string[] args){AddDele<double> addDele = Add;Console.WriteLine(addDele(100, 200));}public static double Add(double x, double y){return x + y;}}
}

Action

.NET中已經為我們定義好了無返回值的泛型委托Action,泛型參數列表與傳入方法的參數列表相對應。如果沒有泛型參數列表,表示該方法無參數列表,無返回值。

static void Main(string[] args)
{Action<string> action = ShowString;action("Hello");Console.Read();
}public static void ShowString(string str)
{Console.WriteLine(str);
}

Func

.NET中已經為我們定義好了有返回值的泛型委托Func,泛型參數列表的最后一個參數代表返回值類型,最后一個之前的參數與傳入方法的參數列表相對應;如果參數列表只有一個類型,表示該方法沒有參數只有一個返回值;

static void Main(string[] args)
{Func<double, double, double> func = Add;Console.WriteLine(func(1.2, 8.8));Console.Read();
}public static double Add(double x, double y)
{return x + y;
}

1.3 委托指向匿名函數

匿名函數顧名思義就是沒有名字的函數,該函數可以綁定到委托類型的變量上。匿名函數的定義形式為:delegate + (參數列表) + {方法體}

static void Main(string[] args)
{Action action = delegate (){Console.WriteLine("I am anonymous function");};action();Func<int, int, int> func = delegate (int x, int y) {return x + y; };Console.WriteLine(func(1, 2));
}

1.4 委托轉換

不同的委托不能混用,這很好理解,不同的Class即使里面的屬性,方法,字段等全都一樣,也是兩個不同的類型,委托也一樣,即使定義了兩個委托參數列表和返回值類型一樣,仍然是不同的委托,不可以混用;舉個例子:

namespace ConsoleApp3
{delegate int AddDele1(int x, int y);delegate int AddDele2(int x, int y);internal class Program{static void Main(string[] args){AddDele1 addDele1 = Add;AddDele2 addDele2 = addDele1;Console.WriteLine(addDele1(1, 2));Console.WriteLine(addDele2(2, 3));Console.Read();}public static int Add(int x, int y){return x + y;}}
}

結果編譯器報錯了:Cannot implicitly convert type 'ConsoleApp3.AddDele1' to 'ConsoleApp3.AddDele2'',看來不同的委托無法進行隱式轉換,正確的做法應該是:

namespace ConsoleApp3
{delegate int AddDele1(int x, int y);delegate int AddDele2(int x, int y);internal class Program{static void Main(string[] args){AddDele1 addDele1 = Add;AddDele2 addDele2 = new AddDele2(addDele1);Console.WriteLine(addDele1(1, 2));Console.WriteLine(addDele2(2, 3));Console.Read();}public static int Add(int x, int y){return x + y;}}
}

2. 從委托到lambda的演化

我們從一個正常的委托調用,看看是如何一步步進化到一個最簡lambda表達式的。

1)委托指向普通方法:

private static void CommonDele()
{Action<string> action = ShowStr;action("CommonDele");Func<int, int> func = ShowNumber;Console.WriteLine(func(1));
}private static void ShowStr(string str)
{Console.WriteLine(str);
}private static int ShowNumber(int a)
{return a;
}

2)委托指向匿名方法:delegate + 參數列表 + 方法體

private static void AnonymousDele()
{Action<string> action = delegate (string str){Console.WriteLine(str);};action("AnonymousDele");Func<int, int> func = delegate (int a){return a;};Console.WriteLine(func(2));
}

3)引入lambda表達式:參數列表 + => + 方法體

private static void LambdaDele()
{Action<string> action = (string str) =>{Console.WriteLine(str);};action("LambdaDele");Func<int, int> func = (int a) =>{return a;};Console.WriteLine(func(3));
}

4)簡化lambda表達式:可以省略參數類型,因為編譯器能夠根據委托類型推斷出參數的類型

private static void LambdaDele2()
{Action<string> action = (str) =>{Console.WriteLine(str);};action("LambdaDele2");Func<int, int> func = (a) =>{return a;};Console.WriteLine(func(4));
}

5)簡化lambda表達式:如果只有一個參數,參數的()也可以省略

private static void LambdaDele3()
{Action<string> action = str =>{Console.WriteLine(str);};action("LambdaDele3");Func<int, int> func = a =>{return a;};Console.WriteLine(func(5));
}

6)簡化lambda表達式:如果方法體沒有返回值,且方法體只有一行代碼,可省略 {};如果有返回值,且方法體中只有一行代碼,那么可以省略方法體的{}以及return

private static void LambdaDele4()
{Action<string> action = str => Console.WriteLine(str);action("LambdaDele4");Func<int, int> func = a => a;Console.WriteLine(func(6));
}

3. lambda

根據上面從委托到lambda的演化過程,我們整理下lambda的基本規則:

  • 基本形式:參數列表 + => + 方法體
  • 可以省略參數數據類型,因為編譯器可根據委托類型推斷參數類型
  • 如果只有一個參數,參數的 () 也可以省略,多于一個不可以省略
  • 如果方法體沒有返回值,且方法體只有一行代碼,可省略 {}
  • 如果方法體有返回值,且方法體只有一行return語句,那么可以省略方法體的 {} 以及return;

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

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

相關文章

【每日論文】TESS 2: A Large-Scale Generalist Diffusion Language Model

下載PDF或閱讀論文&#xff0c;請點擊&#xff1a;LlamaFactory - huggingface daily paper - 每日論文解讀 | LlamaFactory | LlamaFactory 摘要 我們推出了TESS 2&#xff0c;這是一種通用的指令跟隨擴散語言模型&#xff0c;其性能優于當代的指令調整擴散模型&#xff0c;有…

conda 配置源

無論是Anaconda vs Miniconda vs Miniforge 中的哪個&#xff0c;只要使用conda就涉及源&#xff0c;換源的目的是為了加速包的獲取 修改配置文件 通過修改用戶目錄下的 .condarc 文件來使用 不同系統下的 .condarc 目錄如下&#xff1a; Linux: ${HOME}/.condarcmacOS: ${…

AI大模型發展對語音直播交友系統源碼開發搭建的影響

近年來&#xff0c;AI大模型技術突飛猛進&#xff0c;為語音直播交友系統的源碼開發搭建帶來了深遠影響。本文將從技術發展層面&#xff0c;探討AI大模型如何賦能語音直播交友系統&#xff0c;并分析其對開發流程、功能實現和用戶體驗等方面帶來的變革。 一、技術賦能&#xff…

C++面試題,TCP和UDP方面(1)

個人主頁 &#xff1a; 個人主頁 個人專欄 &#xff1a; 《數據結構》 《C語言》《C》《Linux》《網絡》 《redis學習筆記》 文章目錄 前言TCP和UDP的區別UDP如何實現可靠TCP滑動窗口原理TCP流量控制TCP超時重傳總結 前言 這是個人總結的C方向的面試題,TCP和UDP方面&#xff0…

Huatuo熱更新--如何使用

在安裝完huatuo熱更新插件后就要開始學習如何使用了。 1.創建主框漸Main 新建文件夾Main&#xff08;可自定義&#xff09;&#xff0c;然后按下圖創建文件&#xff0c;注意名稱與文件夾名稱保持一致 然后新建場景&#xff08;Init場景&#xff09;&#xff0c;添加3個空物體…

Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek簡單調用示例

1. 版本說明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本&#xff1a; 2. springboot項目搭建 可以集成在自己的項目里&#xff0c;也可以到 spring.io 生成一個項目 生成的話&#xff0c;如下…

如何在 macOS 上配置 MySQL 環境變量

如何在 macOS 上配置 MySQL 環境變量 步驟 1: 查找 MySQL 安裝路徑 打開終端&#xff0c;使用以下命令查找 mysql 的可執行文件路徑&#xff1a; which mysql如果該命令沒有返回結果&#xff0c;可以使用 find 命令&#xff1a; sudo find / -name "mysql" 2>/de…

Unity Excel導表工具轉Lua文件

思路介紹 借助EPPlus讀取Excel文件中的配置數據&#xff0c;根據指定的不同類型的數據配置規則來解析成對應的代碼文本&#xff0c;將解析出的字符串內容寫入到XXX.lua.txt文件中即可 EPPlus常用API //命名空間 using OfficeOpenXml;//Excel文件路徑 var fileExcel new File…

【vue項目中如何實現一段文字跑馬燈效果】

在Vue項目中實現一段文字跑馬燈效果&#xff0c;可以通過多種方式實現&#xff0c;以下是幾種常見的方法&#xff1a; 方法一&#xff1a;使用CSS動畫和Vue數據綁定 這種方法通過CSS動畫實現文字的滾動效果&#xff0c;并結合Vue的數據綁定動態更新文本內容。 步驟&#xff…

AcWing走迷宮-最短路問題-BFS求解

題目描述 給定一個 n * m 的二維整數數組&#xff0c;用來表示一個迷宮&#xff0c;數組中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1 表示不可通過的墻壁。 最初&#xff0c;有一個人位于左上角 (1, 1) 處&#xff0c;已知該人每次可以向上、下、左、右任…

go 錯誤處理 error

普通錯誤處理 // 包路徑 package mainimport ("errors""fmt" )func sqrt(f1, f2 float64) (float64, error) {if f2 < 0 {return 0, errors.New("error: f2 < 0")}return f1 / f2, nil }func sqrt1(f1, f2 float64) {if re, err : sqrt(f…

MCU Bootloader具備什么條件才能跳轉到APP程序

在MCU系統中&#xff0c;BootLoader&#xff08;Boot&#xff09;跳轉到應用程序&#xff08;APP&#xff09;的條件通常由硬件和軟件協同控制&#xff0c;核心邏輯是確保APP的完整性和合法性。以下是關鍵條件及流程&#xff1a; 1. 硬件啟動模式選擇 BOOT引腳電平&#xff1a…

LeeCode題庫第二十八題

28.找出字符串第一個匹配項的下標 項目場景&#xff1a; 給你兩個字符串 haystack 和 needle &#xff0c;請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標&#xff08;下標從 0 開始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;則返回 …

深入解析BFS算法:C++實現無權圖最短路徑的高效解決方案

在無權圖中&#xff0c;廣度優先搜索&#xff08;BFS&#xff09;是解決最短路徑問題的高效算法。接下來博主從專業角度深入探討其實現細節&#xff0c;并給出C代碼示例&#xff1a; 目錄 一、核心原理 二、算法步驟 三、C實現關鍵點 1. 數據結構 2. 邊界檢查 3. 路徑回溯…

Plant Simulation培訓教程-雙深堆垛機立庫仿真模塊

原創 知行 天理智能科技 2025年01月03日 17:02 浙江 又到年終盤點的時候了&#xff0c;在這里我把之前錄制的Plant Simulation培訓教程-雙深堆垛機立庫仿真模塊分享出來&#xff0c;有需要的可以直接聯系我。 雙深堆垛機立庫仿真模塊基于單深模塊開發&#xff0c;適用于雙深堆…

文本和語音互轉

目錄 1. 下載依賴ddl 2. 引入Pom依賴 3. java代碼 二. 語音轉文本 1. 下載中文語音轉文本的模型 2. 引入pom依賴 3. java代碼 4. 運行效果 1. 下載依賴ddl 文字轉語音文件需要使用jacob的dll文件放在jdk安裝目錄下的bin文件夾下 點擊官網下載錄或者通過csdn下載 2. …

DeepSeek破局啟示錄:一場算法優化對算力霸權的降維打擊

導言 2024年,中國AI大模型賽道殺出一匹黑馬——深度求索(DeepSeek)。從數學推理能力超越GPT-4,到API價格僅為Claude 3.5的1/53,再到開源生態的快速擴張,DeepSeek的崛起不僅打破了“算力霸權”的固有認知,更揭示了AI行業底層邏輯的深刻變革。這場技術革命背后,隱藏著技術…

Python大數據可視化:基于python大數據的電腦硬件推薦系統_flask+Hadoop+spider

開發語言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 管理員登錄 管理員功能界面 價格區間界面 用戶信息界面 品牌管理 筆記本管理 電腦主機…

阿里云虛機的遠程桌面登錄提示帳戶被鎖定了

提示由于安全原因&#xff0c;帳戶被鎖定。 阿里云虛機ECS的遠程桌面登錄提示帳戶被鎖定了&#xff0c;只能登錄阿里云處理 阿里云-計算&#xff0c;為了無法計算的價值 需選擇通過VNC連接 然后計算機管理&#xff0c;解除帳戶鎖定即可。

Grok 使用指南

文章來源&#xff1a;Grok 漫游指南 | xAI Docs 歡迎&#xff01;在本指南中&#xff0c;我們將引導您了解使用 xAI API 的基礎知識。 #第 1 步&#xff1a;創建 xAI 帳戶 您需要一個 xAI 帳戶才能訪問 xAI API。在此處注冊帳戶。 創建賬戶后&#xff0c;您需要為其加載積分…