委託是c#最重要的特性之一,c#後面的所有特性基本都是建立在委託的基礎上的。
1、c#委託是什麼?
可以把c#的委託理解為函式的乙個包裝,它使得c#中的函式可以作為引數來被傳遞。如果你學過c++,可以理解為相當於上面的函式指標。
委託的定義和方法的定義類似,只是在定義的前面多了乙個delegate關鍵字。下面就是乙個委託的例子:
public delegate void mydelegate(int para1,string para2);
委託能包裝的方法是有一定限制的,例如能被前面的委託型別mydelegate包裝的方法需要滿足以下條件:
(1)方法的返回型別必須為void;
(2)方法必須有兩個引數,並且第乙個引數應為int型別,第二個引數為string型別。
比如:public vodi mymethod(int a,string b){}
總結一下可以得出:被委託包裝的方法必須滿足方法的簽名必須與委託一致,並且返回型別也是要一致的。(方法簽名:包括引數的個數、型別和順序;返回型別不包含在放哪廣發簽名裡)。
2、委託的使用
使用的方式當然是show出**來解釋最清楚了。
class program
//該方法的定義必須與委託定義相同,即返回型別為void,兩個int型別的引數
void add(int para1,int para2)
//方法的引數是委託型別
private static void mymethod(mydelegate mydelegate)
}從上面的**可以得出委託使用的步驟:定義委託型別->宣告委託變數->例項化委託->作為引數傳遞給方法->呼叫委託。
3、為什麼要引入委託?
委託最大的作用,就是使得乙個方法可以作為另乙個方法的引數進行傳遞。
比如我們要實現乙個打招呼的方法,但每個國家打招呼的方式是不一樣的,我們可能會使用switch的方式進行設計,但這樣做明顯導致可擴充套件性不足,每次增加乙個新的打招呼方法都必須去修改case語句來適應新的需求。如果有了委託,情況就不一樣了:
class program
public void greeting(string name,greetingdelegate callback)
public void chinesegreeting(string name)
public void englishgreeting(string name)
}在引入委託之後,就可以把函式作為引數傳遞給另乙個方法了。委託可以提高方法的可擴充套件性。
4、委託的本質
委託是乙個類型別,從**看得出來呢,就需要從il**中找到答案。
c#**如下:
從上圖中便可以得出委託delegatetest是乙個類,繼承自system.multicastdelegate型別。並且該類包含了乙個建構函式和3個方法。有了建構函式,我們才能使用new關鍵字來例項化委託型別。而invoke方法則用來顯式地呼叫委託。此外,begininvoke和endinvoke是兩個非同步方法(以後解釋什麼叫做非同步方法)。
在最開篇開始的**當中,我們使用mydelegate(1,2)來呼叫方法,這是隱式呼叫,其背後也是要通過呼叫invoke方法來呼叫委託的。當時,我們使用顯式呼叫mydelegate.invoke(1,2)也行。
5、委託鏈
c#中的委託同樣可以封裝多個方法。c#中把封裝多個方法的委託稱作委託鏈或多路廣播委託。
可以通過「+=」運算子,將多個委託物件鏈結到乙個委託物件例項上,成為多路廣播委託例項。也可以使用「-=」運算子將某個委託從委託鏈物件上移除。
class program
private static vodid method1()
private void method2()
}新增一下委託的內部構造,說明了為什麼可以形成乙個委託鏈。
C 中的委託
委託是個比較讓人費解的東西,最近把這個東西翻來覆去看了幾遍了,有了些想法,希望能對同樣卡在這裡的同志一些啟發。在這裡主要提供一種理解思路,畢竟像基本語法 規範之類的,查參考書是最好的了。首先來看看乙個宣告乙個物件的過程 class someclass 定義乙個類 someclass sample 宣...
C 中的委託
c 中的委託 引言 c 中的委託著實讓我迷惑 我是位初學者 在不同的c 書籍中,還譯為 委派等,經反覆查閱資料和自己動手編寫 才稍稍理出點頭緒。c 中的委託類似於c或c 中的函式指標,但兩者有本質區別 c或c 不是型別安全的,但c 中的委託是物件導向的,而且是型別安全的。從技術角度來講,委託是乙個引...
C 中的委託
1.委託概述 委託是c 中新加入的乙個型別,可以把它想作乙個和class類似的一種型別,和使用類相似,使用乙個委託時,需要兩個步驟,首先你要定義乙個委託,就像是定義乙個類一樣 然後,你可以建立乙個或多個該委託的例項。定義乙個委託的語法是這樣的 public protected private del...