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