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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

《.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

總結

以上是生活随笔為你收集整理的将方法作为方法的参数 —— 理解委托的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。