聲明委托(Delegate)
委托聲明決定了可由該委托引用的方法。委托可指向一個與其具有相同标簽的方法。 例如,假設有一個委托:
public delegate int MyDelegateEventHandler (string s);
delegate 是關鍵詞,【注:EventHandler是一個聲明委托的微軟C#的命名标準,我的習慣是标準就要第一時間說,也就這個命名習慣要第一時間養成】
完了,這就是委托,就這麼簡單,看看和我們一般的方法有什麼差別呢?
差別知道了吧,在現實生活中,委托隻是個指令,做事情是别人,而在程式世界裡委托隻是存儲了各個方法的位址,而他自己也是什麼也不做的。
執行個體化委托(Delegate)
一旦聲明了委托類型,委托對象必須使用 new 關鍵字來建立,且與一個特定的方法有關。當建立委托時,傳遞到 new 語句的參數就像方法調用一樣書寫,但是不帶有參數。例如:
public delegate void printStringEventHandler(string s);
...
printStringEventHandler ps1 = new printStringEventHandler(WriteToScreen);
printStringEventHandler ps2 = new printStringEventHandler(WriteToFile);
下面的執行個體示範了委托的聲明、執行個體化和使用,該委托可用于引用帶有一個整型參數的方法,并傳回一個整型值。
using System;
delegate int NumberChangerEventHandler(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)
{
// 建立委托執行個體
NumberChangerEventHandler nc1 = new NumberChangerEventHandler(AddNum);
NumberChangerEventHandler nc2 = new NumberChangerEventHandler(MultNum);
// 使用委托對象調用方法
nc1(25);
Console.WriteLine("Value of Num: {0}", getNum());
nc2(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of Num: 35
Value of Num: 175
注釋:因為num為靜态類型,是以
static int num = 10; 隻執行一次。經過nc1後num變為35.是以執行nc2(5),35*5=175
委托的多點傳播(Multicasting of a Delegate)
委托對象可使用 "+" 運算符進行合并。一個合并委托調用它所合并的兩個委托。隻有相同類型的委托可被合并。"-" 運算符可用于從合并的委托中移除元件委托。
使用委托的這個有用的特點,您可以建立一個委托被調用時要調用的方法的調用清單。這被稱為委托的 多點傳播(multicasting),也叫多點傳播。下面的程式示範了委托的多點傳播:
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(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of Num: 75