拒絕“高冷”辭彙!初學C#中的委托

来源:https://www.cnblogs.com/seanyan/archive/2018/04/22/8906643.html
-Advertisement-
Play Games

有一天,你寫了好多好多帶“形參”的構造函數(就是“方法”,同義),而且需要向這些構造函數里傳遞同樣的“實參”,然後你就憨憨地一個一個函數的調用並賦予同樣的“實參”,這一天就這麼過去了... 又過了幾天,你又要再一次調用這麼多函數了,你再老老實實地一個一個函數進行調用?!聰明的你,肯定會想:真TM麻煩 ...


有一天,你寫了好多好多帶“形參”的構造函數(就是“方法”,同義),而且需要向這些構造函數里傳遞同樣的“實參”,然後你就憨憨地一個一個函數的調用並賦予同樣的“實參”,這一天就這麼過去了...

又過了幾天,你又要再一次調用這麼多函數了,你再老老實實地一個一個函數進行調用?!聰明的你,肯定會想:真TM麻煩!有沒有一勞永逸的辦法呢?

你需要的正是----“委托”

 

來,先看一個簡單的例子,要表述的是----有一位貴賓將要作客一家豪華的酒店,老闆(boss)下發了通知,他的兩個助理(ass1和ass2)分別要通知到女服務員(Waiteress)和廚師(Cooker),讓他們該幹啥幹啥去。

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //委托就是個“類”,也需要“實例化”,讓“ass1”通知“Waiteress”。
 6             Convey_Dele ass1 = new Convey_Dele(Waiteress);
 7 
 8             //讓“ass2”通知“Cooker”
 9             Convey_Dele ass2 = new Convey_Dele(Cooker);
10 
11             //“boss”通知兩個助理“ass1和ass2”,術語為“合併委托(或“多路廣播委托”)
12             Convey_Dele boss = new Convey_Dele(ass1 + ass2);
13 
14             //“boss”發話
15             boss("一位貴賓要來了!");                                      
16 
17             Console.ReadKey();
18         }
19 
20         //聲明一個叫做“Convey_Dele”的委托,形參為“string command”
21         public delegate void Convey_Dele(string command);
22 
23         //構造一個名為“Waiteress”的函數,構造函數的形參必須與委托形參一致!
24         public static void Waiteress(string command)                   
25         {
26             //“Waiteress”要去乾的事兒     
27             Console.WriteLine("女服務員接到通知:" + command + "所以她要去迎接客人");       
28         }
29 
30         public static void Cooker(string command)
31         {
32             Console.WriteLine("廚師也接到了通知:" + command + "所以他去準備飯菜");
33         }
34     }

運行後的結果:

這樣,老闆發出任何指令,下級都該幹啥幹啥去,老闆不需要知道下級的具體動作是什麼,只要乾的好,完成就可以。

 

聰明的你,又會想,代碼能否再簡化和多樣化呢?可以。上面代碼可以更改為:

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Convey_Dele ass1, ass2;
 6 
 7             //另寫函數再實例化太麻煩了,直接在這裡把函數一起寫了。術語“匿名函數”,“delegate”是關鍵字
 8             ass1 = delegate (string command) { Console.WriteLine("女服務員接到通知:" + command + "所以她要去迎接客人"); };
 9 
10             //匿名函數也太麻煩了,還得寫“delegate”,改用一個符號來表示,術語“蘭姆達表達式
11             ass2 = (string command) => { Console.WriteLine("廚師也接到了通知:" + command + "所以他去準備飯菜"); };
12 
13             //等同於 ass1 = ass1 + ass2,基本的“加等”運算符,“減等”也是可以使用的~ 比如:若ass1 = ass1 + ass2,那ass1 -= ass1等同於ass1=ass2
14             ass1 += ass2;     
15 
16             ass1("一位貴賓要來了!");
17 
18             Console.ReadKey();
19         }
20 
21         public delegate void Convey_Dele(string command);
22     }

 運行後的結果與之前未簡化前一模一樣。這樣的簡化寫法還是有很強的“可讀性”的,“匿名函數”和“蘭姆達表達式”還有更簡單的寫法,只要是一個形參,還可以連形參都省略,知道這回事就行了...

 這樣,我們在調用眾多函數的時候就可以靈活運用委托來簡化代碼和“搬磚”的繁瑣勞動。

 

好了,初學委托的內容就先講這麼多吧,我也是在一邊學習,一邊去理解的,在寫博客時表現出來的有許多不足之處請廣大園友指出,我不吝賜教!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.http協議 二.hibernate緩存模式,級別;Hibernate和mybatis的區別和優缺點 三.SQL優化經驗 四.分散式集群和Redis 五.Spring Aop,動態代理; 六.多線程安全問題,多線程實現 thread local 一.HTTP協議(HyperText Transf ...
  • 最近在客戶項目上剛好遇到一個問題,項目需求是要獲取某台機床的實時狀態,問題點剛好就在於該機床不是傳統意義上的數控機床,也不是PLC控制器,只有一個上傳下載程式文件的應用程式,上面剛好有幾個按鈕可以大概判斷當前工作狀態,轉眼一想,是否可以實時獲取幾個按鈕的狀態,從而簡單分析下就確定機床加工狀態。 說乾 ...
  • 5-1 條件測試 :編寫一系列條件測試;將每個測試以及你對其結果的預測和實際結果都列印出來。你編寫的代碼應類似於下麵這樣: car = 'subaru' print("Is car == 'subaru'? I predict True.") print(car == 'subaru') print ...
  • Python中的random模塊用於生成隨機數。 下麵具體介紹random模塊的功能: 1.random.random() #用於生成一個0到1的 隨機浮點數:0<= n < 1.0 2.random.uniform(a,b) #用於生成一個指定範圍內的隨機符點數,兩個參數其中一個是上限,一個是下限 ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Reflection; using Syst ...
  • 主題 本篇我將會介紹驗證用戶的機制當賬戶被創建的時候,同樣 這個過程主要有IUserValidator這個介面來實現的,和密碼驗證一樣Identity同樣也內置已經實現好的賬戶驗證。賬戶驗證的比較簡單,我會先介紹內置的IUserValidator的使用,然後會簡單介紹一些源代碼,最後會演示怎實現一個 ...
  • 問題背景: 最近做一個非常簡單的功能,就是使用ajax請求的方式從服務端請求一段下拉表的數據。 以前也有做過這個功能,只不過這次做這個功能的時候冒出了一個想法: 我請求的這段數據它是一段相對比較固定的數據,也就是說它不怎麼改變,也許幾個月才會改變一次。由於這種數據的變化周期很長,所以以前做這種功能的 ...
  • 本文的概念性內容來自深入淺出設計模式一書. 本文需結合上一篇文章(使用C# (.NET Core) 實現迭代器設計模式)一起看. 上一篇文章我們研究了多個菜單一起使用的問題. 需求變更 就當我們感覺我們的設計已經足夠好的時候, 新的需求來了, 我們不僅要支持多種菜單, 還要支持菜單下可以擁有子菜單. ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...