国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

天天學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();
}
}
}

以上只是自己的一點理解,很多地方都不成熟,可能舉的例子也不恰當,歡迎指點,和大家共同學習



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青河县| 大田县| 万安县| 锦屏县| 铜鼓县| 兴宁市| 常熟市| 佳木斯市| 三都| 通州区| 福贡县| 广德县| 千阳县| 康平县| 泰和县| 合山市| 永定县| 东丰县| 鄯善县| 安龙县| 双流县| 通州市| 乌拉特后旗| 玉龙| 华池县| 德阳市| 定南县| 称多县| 筠连县| 寻乌县| 惠东县| 忻州市| 苗栗县| 江源县| 莲花县| 永州市| 枝江市| 青州市| 泰州市| 剑阁县| 湟中县|