標籤:
1. 委託類似與 C或C++中的函數指標,但委託是 物件導向的,並且是型別安全的
詳情可查看官方文檔:https://msdn.microsoft.com/en-us/library/ms173172.aspx
2. 委託 就相對與 一類方法 (即方法類,或者方法介面)
而這一類方法都具有相同的 修飾符、形參以及 傳回值類型
2.1. 委託 既是方法:
聲明委託的方式如下:在修飾符後加上 delegate [‘d?l?ɡ?t]關鍵字
public delegate void Del(string message);
從格式上看,它與方法的聲明極為相似,就是多了個 delegate關鍵字而已
表示聲明了一類,修飾符為public、一個string類型形參的、沒有傳回值的方法
2.2. 但 委託 不是普通的方法,因為 它也是類,
所以委託只能聲明,而不能定義,如不能這樣寫:
private delegate void Doing(string name){ System.Windows.MessageBox.Show();}
2.3. 執行個體化委託,調用委託
//聲明一個void, 形參是string的委託public delegate void Del(string name);//定義個個cut方法public void cut(string name){ System.Windows.MessageBox.Show("fuck " + name);}//執行個體化委託,傳的參數是一個方法的名字,這裡是cutDel a = new Del(cut);a("CCC");//調用委託,相當於調用cut("CCC");
3. 委託 有什麼用,搞這麼複雜有什麼意思
3.1. 將方法名作為方法參數傳遞,提高代碼的多變性和靈活性,如下:
public delegate void SayHello();public void SayInEnglish(){ toSay = "Hello";}public void SayInChinese(){ toSay = "你好";}public void HelloToSomebody(SayHello say){//將方法作為參數來傳遞 say(toSay); System.Windows.MessageBox.Show(toSay);}
以及:
public delegate void Save(string word); public void SaveTime(string str) { string abc = "abc"; System.Windows.MessageBox.Show("我做我的事情 "+str);//WPF } public void SaveNothing(string str) { System.Windows.MessageBox.Show("沒事可做啊 "+str); } public void HelloToSomebody(Save save) { save("試一試"); } public static void main(string[] args){ Save s = new Save(SaveTime); Save s2 = new Save(SaveNothing); HelloToSomebody(s); HelloToSomebody(s2); }///////////////////////////////// 結果是: 我做我的事情 試一試 沒事可做啊 試一試
4. 委託 的多播 (Multicasting of a Delegate) "+="、"-="
using System;delegate int NumberChanger(int n);namespace DelegateAppl{ class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 建立委託執行個體 NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2;//到這裡,nc其實綁定了2個委託,調用時會按綁定的順序執行 // 調用多播 nc(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } }}//////////////////////////////////// 結果是: Value of Num: 75
注意:委派物件可使用 "+" 運算子進行合并。一個合并委託調用它所合并的兩個委託。只有相同類型的委託可被合并。
"-" 運算子可用於從合并的委託中移除組件委託。
總結:
1. 委託 即使 方法,又是 類(一種特殊的方法:可以方便統一調用;特殊的類,能當方法來用的類,這也夠特殊了吧),委託是一類方法
2. 委託 先聲明,後執行個體化,然後才能調用,委託的參數 是一個方法名
3. 委託的 多調 "+=" , 相反操作 "-="
4. 委託 主要用於事件 還有回呼函數中····
參考:http://www.runoob.com/csharp/csharp-delegate.html
C#中的委託 Delegate