C#基礎(chǔ)之委托用法實(shí)例教程
本文以實(shí)例形式簡(jiǎn)單介紹了C#中委托的用法,是深入學(xué)習(xí)C#程序設(shè)計(jì)所必須掌握的重要技巧。現(xiàn)以教程形式分享給大家供大家參考之用。具體如下:
首先,委托是C#中最為常見的內(nèi)容。與類、枚舉、結(jié)構(gòu)、接口一樣,委托也是一種類型。類是對(duì)象的抽象,而委托則可以看成是函數(shù)的抽象。一個(gè)委托代表了具有相同參數(shù)列表和返回值的所有函數(shù)。比如:
delegate int GetCalculatedValueDelegate(int x, int y);
在上面的定義中,我們定義了一個(gè)委托,這個(gè)委托代表著一類函數(shù),這些函數(shù)的第一個(gè)參數(shù)是整數(shù)型的x,第二個(gè)參數(shù)是整數(shù)型的y,而函數(shù)的返回值則是一個(gè)整數(shù)。在這里,為了描述方便,我們把這一類的函數(shù)稱為具有相同簽名(signature)的函數(shù)(注意:這個(gè)簽名并不是數(shù)字簽名中的概念,而只是表示這類函數(shù)具有相同的參數(shù)列表和返回值)。
既然委托是一種類型,那么它就能被用來定義參數(shù)、變量以及返回值。由委托定義的變量用于保存具有相同簽名的函數(shù)實(shí)體。需要注意的是,C#和C++不同,C++中的函數(shù)指針只能保存全局的或者靜態(tài)的函數(shù),而C#中的委托實(shí)體則可以指代任何函數(shù)。
現(xiàn)在我們來看一個(gè)例子,在這個(gè)例子中,我們使用了上面定義的那個(gè)委托,并創(chuàng)建了一個(gè)委托實(shí)體,使其指代程序中的AddCalculator函數(shù),接下來就可以直接像使用函數(shù)本身一樣,使用這個(gè)委托實(shí)體來獲得計(jì)算的結(jié)果。
delegate int GetCalculatedValueDelegate(int x, int y); static int AddCalculator(int x, int y) { return x + y; } static int SubCalculator(int x, int y) { return x - y; } static void Main(string[] args) { GetCalculatedValueDelegate d = AddCalculator; Console.WriteLine(d(10, 20)); }
到這里也就能基本上明白“委托”的意義了,針對(duì)上面的Main函數(shù),本來需要調(diào)用AddCalculator函數(shù)的,卻通過d來調(diào)用了,也就是,后續(xù)對(duì)AddCalculator的操作由d代為效勞。本來是要小明去老師辦公室拿粉筆盒的,由于小明和小文是好朋友,因此小明就要小文代他去拿,于是小文成了小明的代理,小明委托小文去拿粉筆盒。
現(xiàn)在我們來考慮委托作為參數(shù)的情形。將委托作為參數(shù),可以把函數(shù)本身的處理邏輯抽象出來,而讓調(diào)用者決定最終使用什么樣的邏輯去處理。請(qǐng)看下面的例子:
delegate int GetCalculatedValueDelegate(int x, int y); static int AddCalculator(int x, int y) { return x + y; } static int SubCalculator(int x, int y) { return x - y; } static int Calculator(GetCalculatedValueDelegate del, int x, int y) { return del(x, y); } static void Main(string[] args) { Console.WriteLine(Calculator(AddCalculator, 10, 20)); }
在上面的例子中,Calculator函數(shù)的第一個(gè)參數(shù)就是一個(gè)委托。事實(shí)上,Calculator對(duì)x和y將會(huì)做什么處理,它本身并不知道,如何處理x和y由GetCalculatedValueDelegate來決定。那么在Main方法里,我們將AddCalculator方法作為參數(shù)傳遞給Calculator,表示讓Calculator用AddCalculator的邏輯去處理x和y。這也很形象:Calculator說:“我不知道要怎么處理x和y,讓del去處理好了!”于是就把x和y扔給了del。
這種做法其實(shí)跟“模板方法模式”有點(diǎn)點(diǎn)類似。在模板方法模式中,可以將可變的部分留給子類去重寫,而將不變的部分由父類實(shí)現(xiàn)。那么在委托作為參數(shù)的情況下,Calculator可以自己處理不變的邏輯,而將“具體怎么做”的事情委托給他人去辦理。
委托作為參數(shù),在C#中非常常見。比如線程的創(chuàng)建,需要給一個(gè)ThreadStart或者ParameterizedThreadStart委托作為參數(shù),而在線程執(zhí)行的時(shí)候,將這個(gè)參數(shù)所指代的函數(shù)用作線程執(zhí)行體。再比如:List<T>類型的Find方法的參數(shù)也是一個(gè)委托,它把“怎么去查找”或者說“怎么樣才算找到”這個(gè)問題留給了開發(fā)人員。開發(fā)人員只需要定義一個(gè)參數(shù)為T,返回值為布爾型的函數(shù),實(shí)現(xiàn)函數(shù)體,并將函數(shù)作為參數(shù)傳給Find方法,就可以完成集合中元素的查找。
委托作為返回值一般會(huì)用在“根據(jù)不同情況決定使用不同的委托”這樣的情形下。這有點(diǎn)像工廠模式,不過委托用作返回值還是用的沒有用作參數(shù)這樣頻繁。
與委托相關(guān)的概念還有很多,比如異步調(diào)用、泛型委托、匿名方法、Lambda表達(dá)式、事件、協(xié)變與逆變等。感興趣的讀者可以查看本站相關(guān)文章。
相關(guān)文章
C#實(shí)現(xiàn)合并多個(gè)word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)合并多個(gè)word文檔的方法,是C#針對(duì)Word文檔操作的一個(gè)非常重要的技巧,需要的朋友可以參考下2014-09-09C#使用RenderControl將GridView控件導(dǎo)出到EXCEL的方法
這篇文章主要介紹了C#使用RenderControl將GridView控件導(dǎo)出到EXCEL的方法,是C#應(yīng)用程序設(shè)計(jì)中非常實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-08-08C#命令模式(Command Pattern)實(shí)例教程
這篇文章主要介紹了C#命令模式(Command Pattern),以實(shí)例的形式講述了命令模式通過一個(gè)指令來控制多個(gè)類的多個(gè)方法,需要的朋友可以參考下2014-09-09C#中文隨機(jī)數(shù)實(shí)現(xiàn)方法
這篇文章主要介紹了C#中文隨機(jī)數(shù)實(shí)現(xiàn)方法,涉及C#針對(duì)中文及隨機(jī)數(shù)的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)
本文詳細(xì)講解了C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01基于使用遞歸推算指定位數(shù)的斐波那契數(shù)列值的解決方法
本篇文章介紹了,基于使用遞歸推算指定位數(shù)的斐波那契數(shù)列值的解決方法。需要的朋友參考下2013-05-05