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); } //實例化委托,傳的參數是一個方法的名字,這里是cut Del 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.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx
參考:http://www.runoob.com/csharp/csharp-delegate.html