分享
 
 
 

.NET中的Event与Delegates,从Publisher到Subscriber的衔接!

王朝c#·作者佚名  2006-12-08
窄屏简体版  字體: |||超大  

今天复习了一下C#中的Delegates与Event Handler,整理一下思路如下:

1. 使用Delegates进行事件处理,一般遵循下面的模式:

我们将事件的发起者(Event Source)称为Publisher,将事件的处理者(Event Handler)称为Subscriber.

2. 具体的做法,用一个简单的例子来看如何进行事件的封装处理!

鲨鱼正在网上潜水,突然他决定出门(Event),他会有什么动作呢(Event Handler)?

---> 决定出门了....(一个外部调用...sharkMind.DecideGetOut())

---> 鲨鱼的脑子产生一些生物电... (一个事件激发了... OnGetOut)

---> 谁来做处理,丢给神经系统吧...(一个delegate要负责传递指令....GetOutEventHandler)

---> 具体如何做,当然是鲨鱼的身体啦...(sharkBody.OpenDoor())

---> 一个事件可能需要好几个动作处理哦,所以我需要:开门,放下东西,关门!

2.1 纵观一下整个事件的处理过程...

filename: Program.cs

class Program {

static void Main(string[] args) {

//鲨鱼的脑袋,算是一个事件发起者,the Publisher.

GetOutPublisher sharkMind = new GetOutPublisher();

//鲨鱼的身体,算是一个事件处理者,the Subscriber.

GetOutSubscriber sharkBody = new GetOutSubscriber();

//建立鲨鱼的神经系统单元

GetOutEventHandler eventAction1 = new GetOutEventHandler(sharkBody.OpenTheDoor);

GetOutEventHandler eventAction2 = new GetOutEventHandler(sharkBody.PutDownWhat);

GetOutEventHandler eventAction3 = new GetOutEventHandler(sharkBody.CloseTheDoor);

//把鲨鱼的神经系统单元与脑子联系起来, 即为将事件处理动作注册到事件委托中.

sharkMind.OnGetOutHandler += eventAction1;

sharkMind.OnGetOutHandler += eventAction2;

sharkMind.OnGetOutHandler += eventAction3;

//外面天气不错,我决定出去走走,于是产生一系列的事件处理!

sharkMind.DecideGetOut();

}

}

2.2 剖析整个组成...先从delegate开始,为了能够封装事件,我们需要先定义一个delegate:

delegate void GetOutEventHandler(Object source, GetOutEventArgs e);

2.3 假定你的事件处理的时候,还需要传递一些参数,所以我们还需定义一个EventArgs,

就算出门的时候带什么东西吧~~~ ^ ^!

filename:GetOutEventArgs.cs

class GetOutEventArgs : System.EventArgs {

// 出门带啥东西呢?

private string _takeWhat;

public GetOutEventArgs() {

this._takeWhat = "Nothing";

}

public GetOutEventArgs(string strTakeWhat) {

if (strTakeWhat.Equals("")) {

this._takeWhat = "Nothing";

} else {

this._takeWhat = strTakeWhat;

}

}

public string TakeWhat {

get {

return _takeWhat;

}

set {

_takeWhat = value;

}

}

}

2.4 对应出去,我们就局限下面的响应动作了:

filename:GetOutSubscribe.cs

class GetOutSubscriber {

public void OpenTheDoor(Object source, GetOutEventArgs e) {

// 开门...

Console.WriteLine("Open the door...");

}

public void PutDownWhat(Object source, GetOutEventArgs e) {

// 放下手中的东西...

Console.WriteLine("Put down " + e.TakeWhat + "...");

}

public void CloseTheDoor(Object source, GetOutEventArgs e) {

// 关门...

Console.WriteLine("Close the door...");

}

}

2.5 事件是如何产生的

filename:GetOutPublisher.cs

class GetOutPublisher {

//Publisher 说:喂,我有一个事件,谁来处理?

public event GetOutEventHandler OnGetOutHandler;

//Publisher 产生具体的事件

protected void OnGetOut(GetOutEventArgs e) {

//有谁来负责处理事件吗?

if (null != this.OnGetOutHandler) {

//让他们来处理吧...

OnGetOutHandler(this, e);

}

}

//对外公开的接口,调用此方法会产生事件.

public void DecideGetOut() {

OnGetOut(new GetOutEventArgs());

}

}

2.6 当有了上面的Publisher与Subscriber后,要把它们串起来,需要遵循下面的过程:

Step 1:建立Publisher Instance,即Event Source

Step 2:建立Subscriber Instance,即Event Handler

Step 3:建立一个Delegate,来承接Subscriber的具体动作

Step 4:把建立的Delegate与Event进行绑定,我们称之为register

Step 5:外部调用,产生Event,所有的Event Handler收到通知,开始执行

具体可以参考2.1中的主函数的步骤!

2.7 运行的结果如下:

Open the door...

Put down Nothing...

Close the door...

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有