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
