将方法作为方法的参数 —— 理解委托
《.NET開(kāi)發(fā)之美》上對(duì)于委托寫到:“它們就像是一道檻兒,過(guò)了這個(gè)檻的人,覺(jué)得真是太容易了,而沒(méi)有過(guò)去的人每次見(jiàn)到委托和事件就覺(jué)得心里別得慌,混身不自在。”我覺(jué)得這句話就像是在說(shuō)我自己一樣。于是我決定好好看看關(guān)于這方面的知識(shí)。
一、委托與接口
其實(shí)很多時(shí)候我感覺(jué)委托所起的作用與定義一個(gè)只是含有一個(gè)方法的接口完全一樣的,他們實(shí)現(xiàn)的功能是相同的。
假設(shè)有這樣一個(gè)例子:
?
?
其實(shí)這個(gè)例子很簡(jiǎn)單,就是定義了一個(gè)IGreeting接口,里面有一個(gè)Greetingpeople方法,EnglishGreeting和ChineseGreeting都是通過(guò)實(shí)現(xiàn)這個(gè)接口來(lái)顯示的。
如果通過(guò)委托應(yīng)該怎么樣實(shí)現(xiàn)呢?
二、將方法作為方法的參數(shù)
剛才的功能如果正常我們會(huì)選擇以下方法來(lái)實(shí)現(xiàn):
public void GreetPeople(string name, Language lang){//做某些額外的事情,比如初始化之類,此處略switch (lang){case Language.English:EnglishGreeting(name);break;case Language.Chinese:ChineseGreeting(name);break;}}public void EnglishGreeting(string name){Console.WriteLine("Morning, " + name);}public void ChineseGreeting(string name){Console.WriteLine("早上好, " + name);}public enum Language//enum為枚舉函數(shù){English, Chinese}static void Main(string[] args){GreetPeople("Jimmy Zhang", Language .English ); Console.ReadKey();}但是這樣的方法需要我們反復(fù)修改枚舉和GreetPeople()方法,以適應(yīng)新的需求。
如果你再仔細(xì)想想,假如GreetPeople()方法可以接受一個(gè)參數(shù)變量,這個(gè)變量可以代表另一個(gè)方法,當(dāng)我們給這個(gè)變量賦值?EnglishGreeting的時(shí)候,它代表著?EnglsihGreeting()?這個(gè)方法;當(dāng)我們給它賦值ChineseGreeting?的時(shí)候,它又代表著ChineseGreeting()方法。我們將這個(gè)參數(shù)變量命名為?MakeGreeting,那么不是可以如同給name賦值時(shí)一樣,在調(diào)用?GreetPeople()方法的時(shí)候,給這個(gè)MakeGreeting?參數(shù)也賦上值么(ChineseGreeting或者EnglsihGreeting等)?然后,我們?cè)诜椒w內(nèi),也可以像使用別的參數(shù)一樣使用?MakeGreeting。但是,由于MakeGreeting代表著一個(gè)方法,它的使用方式應(yīng)該和它被賦的方法(比如ChineseGreeting)?是一樣的,比如:MakeGreeting(name)。
按照上面的思路,
Public?void?EnglishGreeting(string?name)
public?void?ChineseGreeting(string?name)
string?定義了name參數(shù)所能代表的值的種類,也就是name參數(shù)的類型。于是,委托出現(xiàn)了:它定義了MakeGreeting參數(shù)所能代表的方法的種類,也就是MakeGreeting參數(shù)的類型。
?
???
于是,從圖中可以看出,生命了GreetingDelegate:?public?delegate?void?GreetingDelegate(string?name)。并且,在greetpeople?方法中,MakeGreeting方法作為參數(shù)與name地位是一樣的。代碼如下:
private static void GreetPeople(string name, GreetingDelegate MakeGreeting){MakeGreeting(name);}
? 同理,而既然委托GreetingDelegate?和?類型?string?的地位一樣,都是定義了一種參數(shù)類型,那么,我是不是也可以這么使用委托?
static void Main(string[] args) {GreetingDelegate delegate1, delegate2;delegate1 = EnglishGreeting;delegate2 = ChineseGreeting;GreetPeople("Jimmy Zhang", delegate1);GreetPeople("張子陽(yáng)", delegate2);Console.ReadKey();轉(zhuǎn)載于:https://www.cnblogs.com/tanqianqian/p/5975049.html
總結(jié)
以上是生活随笔為你收集整理的将方法作为方法的参数 —— 理解委托的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 手机号、姓名、邮箱等合法性验证方法
- 下一篇: 无线路由器网络测试软件,简单快速测试家里