c#編碼技巧(十四):全面總結delegate、Func委托的寫法演變

delegate委托對于初學者來說不太好理解。
按筆者的經驗,delegate本質是函數指針,可以把它理解為某一類方法的入口,把他翻譯為:“長得像XXX的函數方法(入參是什么、返回值是什么)”可能更容易理解。
以下示例是delegate的寫法列舉:

    //步驟一 聲明委托public delegate string SayHelloDelegate(string name);internal class Program{static void Main(string[] args){//步驟二 初始化/賦值//寫法1SayHelloDelegate sayHello1 = MySayHello;//寫法變種2SayHelloDelegate sayHello2 = delegate (string name) { return "Hello " + name; };//寫法變種3SayHelloDelegate sayHello3 = (string name) => { return "Hello " + name; };//寫法變種4SayHelloDelegate sayHello4 = name => { return "Hello " + name; };//寫法變種5SayHelloDelegate sayHello5 = name => "Hello " + name;//步驟三 調用var msg = sayHello1("foolishsunday");//sayHello2("foolishsunday");//sayHello3("foolishsunday");//sayHello4("foolishsunday");//sayHello5("foolishsunday");Console.WriteLine(msg);//由于delegate的使用每次都需要步驟一聲明委托,因此微軟添加了語法糖Func和Action,把步驟一和二合并在一塊寫//Func示例Func<string, string> funcHello1 = MySayHello;Func<string, string> funcHello2 = (string name) => { return "Hello " + name; };Func<string, string> funcHello3 = name => { return "Hello " + name; };Func<string, string> funcHello4 = name => "Hello " + name;//調用Funcvar result = funcHello1("test");Console.WriteLine(result);Console.ReadLine();}static string MySayHello(string name){return "Hello " + name;}}

輸出:

Hello foolishsunday
Hello test

可見Func的寫法及多種變種寫法都跟delegate如出一轍,但用Func更簡化,而且Func能直觀看到入參和返回值;

在實際編程中,很多情況需要把函數指針作為參數傳入

因為具體函數的實現往往是變化的,但函數入口是不變(這里的函數入口指的是入參與返回值組成的函數形式
其實delegate/Func/Action并不少見,尤其是C#底層代碼,幾乎隨處可見
舉個常見例子,linq中就大量用到Func

			//Where方法的底層定義://其中入參就有Func<TSource, bool> predicatepublic static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

使用Where看看

            //例:查找長度為2的字符串并打印//本例中的where方法就是需要傳入一個Func<TSource, bool> predicate作為參數(e => e.Length == 2)"a,bb,ccc".Split(',').Where(e => e.Length == 2).ToList().ForEach(e => Console.WriteLine(e));//而Func<TSource, bool> predicate入參也可以因需求變更為(e =>  e.StartsWith("c")):查找c開頭的字符串"a,bb,ccc".Split(',').Where(e => e.StartsWith("c")).ToList().ForEach(e => Console.WriteLine(e));Console.ReadLine();

總結:

  • delegate有多種寫法,只不過是一個比一個簡化而已。
  • 甚至Func/Action的出現都是為了簡化delegate的寫法。
  • 它的本質也是一個函數指針,它可以實現函數/方法作為參數傳入另一個函數方法體。
  • 在學習設計模式中,我們學過:找到變化并封裝之,把不變的和易變的隔離開來。
    委托就很好體現了這種封裝,某一類函數的入參與返回值總是不變的,它的具體實現過程是可變的。我們就可以把它提煉為一個委托。

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

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

相關文章

2023杭電多校第7場M題-M. Minimal and Maximal XOR Sum

題目鏈接&#xff1a;csoj | M. Minimal and Maximal XOR Sum (scnu.edu.cn) 解題思路&#xff1a; 最小值&#xff1a;每次操作的區間長度為2&#xff0c;即交換兩個相鄰數&#xff0c;每次異或2(10)&#xff0c;故最小值肯定為2(10)或0(00)&#xff0c;如果是偶排序最小值是…

Java接口壓力測試—如何應對并優化Java接口的壓力測試

導言 在如今的互聯網時代&#xff0c;Java接口壓力測試是評估系統性能和可靠性的關鍵一環。一旦接口不能承受高并發量&#xff0c;用戶體驗將受到嚴重影響&#xff0c;甚至可能導致系統崩潰。因此&#xff0c;了解如何進行有效的Java接口壓力測試以及如何優化接口性能至關重要…

SpringBoot復習:(48)RedisAutoConfiguration自動配置類

RedisAutoConfiguration類代碼如下&#xff1a; 可以看到在這個類中配置了2個bean: redisTemplate和stringRedisTemplate. 而它通過EnableConfigurationProperties(RedisProperties.class)注解&#xff0c;把配置文件中配置的Redis相關的信息引入進來了&#xff0c;RedisPrope…

安裝Linux操作系統CentOS 6詳細圖文步驟

為滿足業務對Linux操作系統部署的要求&#xff0c;本文檔主要提供CentOS 6操作系統的最小化安裝和基本配置, 安裝本系統建議最少1GB內存和2GB磁盤空間。 1、 使用光盤或者掛載ISO鏡像&#xff0c;在出現如下圖形界面時選擇【Install or upgrade an existing system】并按Ent…

CLickhouse核心特性

目錄 CLickhouse核心特性 1 完備的DBMS功能 2 列式存儲與數據壓縮 3 向量化執行引擎 4 關系模型與SQL查詢 5 多樣化的表引擎 6 多線程與分布式 7 多主架構 8 在線查詢 9 數據分片與分布式查詢 Clickhouse適用場景 Clickhouse不適用場景 Clickhouse名稱含義 CLickh…

P8642 [藍橋杯 2016 國 AC] 路徑之謎

[藍橋杯 2016 國 AC] 路徑之謎 題目描述 小明冒充 X X X 星球的騎士&#xff0c;進入了一個奇怪的城堡。 城堡里邊什么都沒有&#xff0c;只有方形石頭鋪成的地面。 假設城堡地面是 n n n\times n nn 個方格。如圖所示。 按習俗&#xff0c;騎士要從西北角走到東南角。 …

C/C++中const關鍵字詳解

為什么使用const&#xff1f;采用符號常量寫出的代碼更容易維護&#xff1b;指針常常是邊讀邊移動&#xff0c;而不是邊寫邊移動&#xff1b;許多函數參數是只讀不寫的。const最常見用途是作為數組的界和switch分情況標號(也可以用枚舉符代替)&#xff0c;分類如下&#xff1a;…

音視頻 vs2017配置FFmpeg

vs2017 ffmpeg4.2.1 一、首先我把FFmpeg整理了一下&#xff0c;放在C盤 二、新建空項目 三、添加main.cpp&#xff0c;將bin文件夾下dll文件拷貝到cpp目錄下 #include<stdio.h> #include<iostream>extern "C" { #include "libavcodec/avcodec.h&…

【Docker】使用 Docker Registry 搭建自己的 Docker 鏡像倉庫

使用 Docker Registry 搭建自己的 Docker 鏡像倉庫 在使用 Docker 進行應用程序的開發和部署時&#xff0c;使用 Docker 鏡像倉庫是一個很好的實踐。它允許集中存儲和管理 Docker 鏡像&#xff0c;方便團隊協作和版本控制。在本文中&#xff0c;將介紹如何使用 Docker Registr…

Nginx隨筆

Nginx下載鏈接 安裝命令&#xff1a; apt update apt install nginx 一、基礎命令&#xff08;Ubuntu&#xff09; 1、在全局 nginx -t //檢查Nginx的配置文件是否有錯 systemctl start nginx //啟動Nginx systemctl stop nginx //停止Nginx systemctl status nginx //查…

【數據結構與算法——TypeScript】圖結構(Graph)

【數據結構與算法——TypeScript】 圖結構(Graph) 認識圖結構以及特性 什么是圖? 在計算機程序設計中&#xff0c;圖結構 也是一種非常常見的數據結構。 但是&#xff0c;圖論其實是一個非常大的話題 認識一下關于圖的一些內容 圖的抽象數據類型一些算法實現。 什么是圖?…

jmeter獲取mysql數據

JDBC Connection Configuration Database URL: jdbc:mysql:// 數據庫地址 /庫名 JDBC Driver class&#xff1a;com.mysql.jdbc.Driver Username&#xff1a;賬號 Password&#xff1a;密碼 JDBC Request 字段含義 字段含義 Variable Name Bound to Pool 數據庫連接池配置…

使用vue3 + ts + vite + v-md-editor 在前端頁面預覽markdown文件

1.效果預覽 2. 依賴包安裝 yarn add kangc/v-md-editornext v-md-editor中文官網&#xff1a;https://code-farmer-i.github.io/vue-markdown-editor/zh/ v-md-editor分為4種組件&#xff1a; 輕量版編輯器進階版編輯器預覽組件html預覽組件 對UI組件庫頁面&#xff0c;我只需…

問道管理:縮量小幅上漲說明什么?

股市里面&#xff0c;股票價格上漲或跌落都是常見現象。可是關于那些在商場上尋求收益的出資者來說&#xff0c;他們需要對每一個股市中的價格動搖有深化的了解&#xff0c;以便做出更正確的出資決策。最近&#xff0c;出資者們發現商場縮量小幅上漲的現象時有發生&#xff0c;…

Jmeter壓測實戰:Jmeter二次開發之自定義函數

目錄 1 前言 2 開發準備 3 自定義函數核心實現 3.1 新建項目 3.2 繼承實現AbstractFunction類 3.3 最終項目結構 4 Jmeter加載擴展包 4.1 maven構建配置 4.2 項目打包 4.3 Jmeter加載擴展包 5 自定義函數調用調試 5.1 打開Jmeter函數助手&#xff0c;選擇自定義函數…

clickhouse 刪除操作

OLAP 數據庫設計的宗旨在于分析適合一次插入多次查詢的業務場景&#xff0c;市面上成熟的 AP 數據庫在更新和刪除操作上支持的均不是很好&#xff0c;當然 clickhouse 也不例外。但是不友好不代表不支持&#xff0c;本文主要介紹在 clickhouse 中如何實現數據的刪除&#xff0c…

單鏈表相關操作(插入,刪除,查找)

通過上一節我們知道順序表的優點&#xff1a; 可隨機存儲&#xff08;O(1)&#xff09;&#xff1a;查找速度快 存儲密度高&#xff1a;每個結點只存放數據元素&#xff0c;而單鏈表除了存放數據元素之外&#xff0c;還需存儲指向下一個節點的指針 http://t.csdn.cn/p7OQf …

【2023年11月第四版教材】《第4章-信息系統管理(合集篇)》

第4章-信息系統管理之管理方法&#xff08;第四版新增章節&#xff09;&#xff08;第一部分&#xff09; 章節說明1 管理方法1.1 信息系統四個要素1.2 信息系統四大領域1.3 信息系統戰略三角1.4 信息系統架構轉換1.5 信息系統體系架構1.6 信息系統運行1.7 運行和監控1.8 管理和…

北郵鄧中亮:深度融合5G+北斗,實現高精準定位

如今&#xff0c;萬物互聯時代&#xff0c;物與物、物與人、人與人之間需要實現更多的互聯。在如此復雜多變的環境中&#xff0c;定位技術面臨著著更多挑戰和需求&#xff0c;需要不斷的創新和改進。唯有如此&#xff0c;才能滿足未來智能交通、無人駕駛和工業互聯網等領域的高…

kafka基本概念及操作

kafka介紹 Kafka是最初由Linkedin公司開發&#xff0c;是一個分布式、支持分區的&#xff08;partition&#xff09;、多副本的 &#xff08;replica&#xff09;&#xff0c;基于zookeeper協調的分布式消息系統&#xff0c;它的最大的特性就是可以實時的處理大量數據以滿足各…