日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

将方法作为方法的参数 —— 理解委托

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将方法作为方法的参数 —— 理解委托 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《.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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。