對學過c/c++的來說,delegate就相當於函數指針,看下面的代碼:
class Person
{
public Person(string name)
{
this.name=name;
}
//一些屬性和方法
string name;
public void Eat(Food food);
}
Person類有一個Eat方法,對它的實例來說,張三,李四,王五都有他們自己的Eat方法
Person zhanSan,liSi,wangWu;
zhanSan=new Person(”張三”);
liSi=new Person(”李四”);
wangWu=new Person(”王五”);
我們可以通過定義一個委托來分別調用Eat方法
public void delegate Eat(Food food);
如果想調用zhanSan.Eat(food)
Eat zhanSanEat=new Eat(zhanSan.Eat);
其他類似:
Eat liSIEat=new Eat(liSi.Eat);
Eat wangWu=new Eat(wangWu.Eat);
這樣調用zhanSanEat(food)就相當於調用zhanSan.Eat(food)
委托最有用的是委托鏈,如果張三,李四,王五共同進餐
則可以定義委托如下
//定義復合委托
Eat togetherEat;
//c#中通過“+“將方法Connect到委托,即將委托加到委托鏈中
//通過“-”將方法從委托鏈中刪除
togetherEat=zhanSanEat+liSIEat+wangwuEat;
//張三,李四,王五一起吃西瓜
togetherEat(西瓜);
//不帶張三,只有李四和王五吃
togetherEat=liSIEat+wangWuEat;
togetherEat(西瓜);
.Net中的事件機制就是通過委托來實現的。
下面是C#技術揭密上的一段源代碼,我加了一些注釋,講解了事件的實現機制
//InventoryManager類用於更新庫存量,它也定義了當更新庫存量時應該觸發的事件,也就是說它發布一個委托由訂閱者調用
//InventoryWatcher類定義的是訂閱者,可以選擇是否將自己添加到發布者的列表中,從而在更新庫存時,得到通知
using System;
namespace DelegateEvents
{
//定義EventArgs的派生類,用來攜帶事件信息
class InventoryChangeEventArgs:System.EventArgs
{
public InventoryChangeEventArgs(string sku,int change)
{
this.sku=sku;
this.change= change;
}
string sku;
public string Sku
{
get{return sku;}
}
int change;
public int Change
{
get{return change;}
}
}
//發布者
class InventoryManager
{
//聲明一個委托,兩個參數必不可少,第一個是發布者對象,第二個一定要是EventArgs類或者其派生類
public delegate void InventoryChangeEventHandler(object source,InventoryChangeEventArgs e);
//定義該委托的事件實例(即委托鏈,用於訂閱者將自己加到委托鏈中
public event InventoryChangeEventHandler OnInventoryChangeHandler;
//InventoryManager的方法