国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#基礎:委托

2019-11-17 02:14:42
字體:
來源:轉載
供稿:網友

C#基礎:委托

委托是C#中最為常見的內容。與類、枚舉、結構、接口一樣,委托也是一種類型。類是對象的抽象,而委托則可以看成是函數的抽象。一個委托代表了具有相同參數列表和返回值的所有函數。比如:

  1. delegateintGetCalculatedValueDelegate(intx,inty);

在上面的定義中,我們定義了一個委托,這個委托代表著一類函數,這些函數的第一個參數是整數型的x,第二個參數是整數型的y,而函數的返回值則是一個整數。在這里,為了描述方便,我們把這一類的函數稱為具有相同簽名(signature)的函數(注意:這個簽名并不是數字簽名中的概念,而只是表示這類函數具有相同的參數列表和返回值)。

既然委托是一種類型,那么它就能被用來定義參數、變量以及返回值。由委托定義的變量用于保存具有相同簽名的函數實體。需要注意的是,C#和C++不同,C++中的函數指針只能保存全局的或者靜態的函數,而C#中的委托實體則可以指代任何函數。

現在我們來看一個例子,在這個例子中,我們使用了上面定義的那個委托,并創建了一個委托實體,使其指代程序中的AddCalculator函數,接下來就可以直接像使用函數本身一樣,使用這個委托實體來獲得計算的結果。

  1. delegateintGetCalculatedValueDelegate(intx,inty);
  2. staticintAddCalculator(intx,inty)
  3. {
  4. returnx+y;
  5. }
  6. staticintSubCalculator(intx,inty)
  7. {
  8. returnx-y;
  9. }
  10. staticvoidMain(string[]args)
  11. {
  12. GetCalculatedValueDelegated=AddCalculator;
  13. Console.WriteLine(d(10,20));
  14. }

到這里也就能基本上明白“委托”的意義了,針對上面的Main函數,本來需要調用AddCalculator函數的,卻通過d來調用了,也就是,后續對AddCalculator的操作由d代為效勞。本來是要小明去老師辦公室拿粉筆盒的,由于小明和小文是好朋友,因此小明就要小文代他去拿,于是小文成了小明的代理,小明委托小文去拿粉筆盒。

現在我們來考慮委托作為參數的情形。將委托作為參數,可以把函數本身的處理邏輯抽象出來,而讓調用者決定最終使用什么樣的邏輯去處理。請看下面的例子:

  1. delegateintGetCalculatedValueDelegate(intx,inty);
  2. staticintAddCalculator(intx,inty)
  3. {
  4. returnx+y;
  5. }
  6. staticintSubCalculator(intx,inty)
  7. {
  8. returnx-y;
  9. }
  10. staticintCalculator(GetCalculatedValueDelegatedel,intx,inty)
  11. {
  12. returndel(x,y);
  13. }
  14. staticvoidMain(string[]args)
  15. {
  16. Console.WriteLine(Calculator(AddCalculator,10,20));
  17. }

在上面的例子中,Calculator函數的第一個參數就是一個委托。事實上,Calculator對x和y將會做什么處理,它本身并不知道,如何處理x和y由GetCalculatedValueDelegate來決定。那么在Main方法里,我們將AddCalculator方法作為參數傳遞給Calculator,表示讓Calculator用AddCalculator的邏輯去處理x和y。這也很形象:Calculator說:“我不知道要怎么處理x和y,讓del去處理好了!”于是就把x和y扔給了del。

這種做法其實跟“模板方法模式”有點點類似。在模板方法模式中,可以將可變的部分留給子類去重寫,而將不變的部分由父類實現。那么在委托作為參數的情況下,Calculator可以自己處理不變的邏輯,而將“具體怎么做”的事情委托給他人去辦理。

委托作為參數,在C#中非常常見。比如線程的創建,需要給一個ThreadStart或者ParameterizedThreadStart委托作為參數,而在線程執行的時候,將這個參數所指代的函數用作線程執行體。再比如:List<T>類型的Find方法的參數也是一個委托,它把“怎么去查找”或者說“怎么樣才算找到”這個問題留給了開發人員。開發人員只需要定義一個參數為T,返回值為布爾型的函數,實現函數體,并將函數作為參數傳給Find方法,就可以完成集合中元素的查找。

委托作為返回值一般會用在“根據不同情況決定使用不同的委托”這樣的情形下。這有點像工廠模式,不過委托用作返回值還是用的沒有用作參數這樣頻繁。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张家界市| 崇阳县| 保康县| 德兴市| 湘乡市| 南岸区| 永兴县| 汝州市| 昆山市| 景泰县| 凤凰县| 黔西县| 黎城县| 始兴县| 新田县| 开平市| 恩平市| 任丘市| 彭阳县| 都兰县| 郑州市| 河曲县| 梧州市| 法库县| 朝阳区| 天台县| 格尔木市| 宣城市| 平舆县| 获嘉县| 惠水县| 邻水| 施秉县| 万源市| 进贤县| 翼城县| 万安县| 英德市| 湾仔区| 武汉市| 宁南县|