天天學C#-委托
2024-07-21 02:18:47
供稿:網友
國內最大的酷站演示中心!
對學過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的方法,用于更新庫存
public void updateinventory(string sku,int change)
{
if(0==change)
return;
//定義事件參數實例,傳遞sku和change信息
inventorychangeeventargs e=new inventorychangeeventargs(sku,change);
//判斷委托鏈表是否為空,如果不空,說明有訂閱者訂閱
if(this.oninventorychangehandler!=null)
{
console.writeline("[inventorymanager.updateinventory] raising event to all subscribers.../n");
//依次調用委托鏈表上的方法
this.oninventorychangehandler(this,e);
}
}
}
//訂閱者
class inventorywatcher
{
//定義發布者
inventorymanager invnetorymanager;
public inventorywatcher(inventorymanager inventorymanager)
{
console.writeline("[inventorywatcher.inventorywatcher] subscribing to inventorychange event/n");
this.invnetorymanager=inventorymanager;
//將自己connect到inventorymanager.inventorychangeeventhandler委托
inventorymanager.oninventorychangehandler+=new inventorymanager.inventorychangeeventhandler(oninventorychange);
}
//訂閱者的方法,用于在發布者更新庫存量時調用
void oninventorychange(object source,inventorychangeeventargs e)
{
int change=e.change;
console.writeline("[inventorymanager.oninventorychange]/n/tpart'{0}' was {1} by {2} units/n",e.sku,change>0?"increased":"decreased",math.abs(e.change));
}
}
/// <summary>
/// 用委托實現事件機制實例
/// </summary>
class delegateevents
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[stathread]
static void main(string[] args)
{
//定義委托發布者對象
inventorymanager inventorymanager=new inventorymanager();
console.writeline("[delegateevents.main instantiating subscriber object/n");
//定義訂閱者對象
inventorywatcher inventwatcher=new inventorywatcher(inventorymanager);
inventorymanager.updateinventory("111 006 116",2);
inventorymanager.updateinventory("111 005 383",5);
console.readline();
}
}
}
以上只是自己的一點理解,很多地方都不成熟,可能舉的例子也不恰當,歡迎指點,和大家共同學習