大白話講解C# 中的委托
有一天,你寫(xiě)了好多好多帶“形參”的構(gòu)造函數(shù)(就是“方法”,同義),而且需要向這些構(gòu)造函數(shù)里傳遞同樣的“實(shí)參”,然后你就憨憨地一個(gè)一個(gè)函數(shù)的調(diào)用并賦予同樣的“實(shí)參”,這一天就這么過(guò)去了...
又過(guò)了幾天,你又要再一次調(diào)用這么多函數(shù)了,你再老老實(shí)實(shí)地一個(gè)一個(gè)函數(shù)進(jìn)行調(diào)用?!聰明的你,肯定會(huì)想:真TM麻煩!有沒(méi)有一勞永逸的辦法呢?
你需要的正是----“委托”
來(lái),先看一個(gè)簡(jiǎn)單的例子,要表述的是----有一位貴賓將要作客一家豪華的酒店,老板(boss)下發(fā)了通知,他的兩個(gè)助理(ass1和ass2)分別要通知到女服務(wù)員(Waiteress)和廚師(Cooker),讓他們?cè)摳缮陡缮度ァ?/p>
class Program
{
static void Main(string[] args)
{
//委托就是個(gè)“類(lèi)”,也需要“實(shí)例化”,讓“ass1”通知“Waiteress”。
Convey_Dele ass1 = new Convey_Dele(Waiteress);
//讓“ass2”通知“Cooker”
Convey_Dele ass2 = new Convey_Dele(Cooker);
//“boss”通知兩個(gè)助理“ass1和ass2”,術(shù)語(yǔ)為“合并委托(或“多路廣播委托”)”
Convey_Dele boss = new Convey_Dele(ass1 + ass2);
//“boss”發(fā)話
boss("一位貴賓要來(lái)了!");
Console.ReadKey();
}
//聲明一個(gè)叫做“Convey_Dele”的委托,形參為“string command”
public delegate void Convey_Dele(string command);
//構(gòu)造一個(gè)名為“Waiteress”的函數(shù),構(gòu)造函數(shù)的形參必須與委托形參一致!
public static void Waiteress(string command)
{
//“Waiteress”要去干的事兒
Console.WriteLine("女服務(wù)員接到通知:" + command + "所以她要去迎接客人");
}
public static void Cooker(string command)
{
Console.WriteLine("廚師也接到了通知:" + command + "所以他去準(zhǔn)備飯菜");
}
}
運(yùn)行后的結(jié)果:

這樣,老板發(fā)出任何指令,下級(jí)都該干啥干啥去,老板不需要知道下級(jí)的具體動(dòng)作是什么,只要干的好,完成就可以。
聰明的你,又會(huì)想,代碼能否再簡(jiǎn)化和多樣化呢?可以。上面代碼可以更改為:
class Program
{
static void Main(string[] args)
{
Convey_Dele ass1, ass2;
//另寫(xiě)函數(shù)再實(shí)例化太麻煩了,直接在這里把函數(shù)一起寫(xiě)了。術(shù)語(yǔ)“匿名函數(shù)”,“delegate”是關(guān)鍵字
ass1 = delegate (string command) { Console.WriteLine("女服務(wù)員接到通知:" + command + "所以她要去迎接客人"); };
//匿名函數(shù)也太麻煩了,還得寫(xiě)“delegate”,改用一個(gè)符號(hào)來(lái)表示,術(shù)語(yǔ)“蘭姆達(dá)表達(dá)式”
ass2 = (string command) => { Console.WriteLine("廚師也接到了通知:" + command + "所以他去準(zhǔn)備飯菜"); };
//等同于 ass1 = ass1 + ass2,基本的“加等”運(yùn)算符,“減等”也是可以使用的~ 比如:若ass1 = ass1 + ass2,那ass1 -= ass1等同于ass1=ass2
ass1 += ass2;
ass1("一位貴賓要來(lái)了!");
Console.ReadKey();
}
public delegate void Convey_Dele(string command);
}
運(yùn)行后的結(jié)果與之前未簡(jiǎn)化前一模一樣。這樣的簡(jiǎn)化寫(xiě)法還是有很強(qiáng)的“可讀性”的,“匿名函數(shù)”和“蘭姆達(dá)表達(dá)式”還有更簡(jiǎn)單的寫(xiě)法,只要是一個(gè)形參,還可以連形參都省略,知道這回事就行了...
這樣,我們?cè)谡{(diào)用眾多函數(shù)的時(shí)候就可以靈活運(yùn)用委托來(lái)簡(jiǎn)化代碼和“搬磚”的繁瑣勞動(dòng)。
好了,初學(xué)委托的內(nèi)容就先講這么多吧,我也是在一邊學(xué)習(xí),一邊去理解的,在寫(xiě)博客時(shí)表現(xiàn)出來(lái)的有許多不足之處請(qǐng)廣大園友指出,我不吝賜教!
以上就是大白話講解C# 中的委托的詳細(xì)內(nèi)容,更多關(guān)于c# 委托的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#WinFrom導(dǎo)出Excel過(guò)程解析
這篇文章主要介紹了C#WinFrom導(dǎo)出Excel過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
詳解C#用new和override來(lái)實(shí)現(xiàn)抽象類(lèi)的重寫(xiě)區(qū)別
本篇文章主要介紹了詳解C#用new和override來(lái)實(shí)現(xiàn)抽象類(lèi)的重寫(xiě)區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2017-02-02
基于不要返回null之EmptyFactory的應(yīng)用詳解
本篇文章對(duì)不要返回null之EmptyFactory進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
微信公眾平臺(tái)開(kāi)發(fā)教程(三) 基礎(chǔ)框架搭建
這篇文章主要介紹了微信公眾平臺(tái)開(kāi)發(fā)教程(三) 基礎(chǔ)框架搭建,具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12
C#實(shí)現(xiàn)將網(wǎng)頁(yè)保存成圖片的網(wǎng)頁(yè)拍照功能
這篇文章主要介紹了C#實(shí)現(xiàn)將網(wǎng)頁(yè)保存成圖片的網(wǎng)頁(yè)拍照功能,很實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-07-07
C# TextBox控件實(shí)現(xiàn)只能輸入數(shù)字的方法
這篇文章主要介紹了C# TextBox控件實(shí)現(xiàn)只能輸入數(shù)字的方法,本文使用TextBox的keypress事件實(shí)現(xiàn)這個(gè)需求,需要的朋友可以參考下2015-06-06
c#封裝百度web服務(wù)geocoding api 、百度坐標(biāo)轉(zhuǎn)換示例
這篇文章主要介紹了c#封裝百度Web服務(wù)geocoding api 、百度坐標(biāo)轉(zhuǎn)換,需要的朋友可以參考下2014-04-04
Unity編輯器預(yù)制體工具類(lèi)PrefabUtility常用函數(shù)和用法
這篇文章主要為大家介紹了Unity編輯器預(yù)制體工具類(lèi)PrefabUtility常用函數(shù)及用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

