什么是事件不多讲了,直入主题让我们来看看事件中的两个角色:
一:事件发行者(Publisher):一个事件发行者,也称作发送者(sender),其实就是一个对象,这个
对象会自行维护本身的状态信息。当本身状态信息变动时,便会触发一个事件,并通知所有的事件
订阅者。
二:事件订阅者(subscriber):对事件感兴趣的对象,也叫做接受者(receiver),可以注册感兴趣的
事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容
下面通过讲故事来理解事件
订阅者到出版社订阅报刊,报刊一旦发行就会送到订阅者手中。
在这个故事中,图书的出版就是事件,出版局就是事件的发行者,订户是事件的订阅者。
1
using System;
2
using System.Collections.Generic;
3![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
namespace evnt
5
{
6
class Publisher //出版社
7
{
8
public delegate void Publish(); //事件所需的代理
9
public event Publish OnPublish=null;//事件的声明
10
public void issu() //触发事件的方法
11
{
12
if(OnPublish!=null)
13
{
14
Console.WriteLine("发行刊物");
15
OnPublish();
16
Console.ReadLine();
17
}
18
}
19
}
20
21
class Subscriber //订阅者
22
{
23
public void Receive()//在事件订阅者中定义事件处理程序
24
{
25
Console.WriteLine("订阅者已经收到了刊物");
26
}
27
}
28
29
class Story //故事发生在订阅者和出版社之间
30
{
31
static void Main()
32
{
33
Publisher Pub=new Publisher();
34
Subscriber zs=new Subscriber();
35
Pub.OnPublish+=new Publisher.Publish(zs.Receive);//向事件发行者订阅一个事件
36
//事件发行者收到一个事件
37
Pub.issu(); //收到事件后做出的处理
38
}
39
}
40
}
41![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
故事2:张三订阅《生活》杂志和李四订阅《生活》《电脑》2本杂志,一年后由于经济危机李四退订了《电脑》杂志
首先我们定义事件发行者(Publisher)
1
class Publisher //出版社
2
{
3
public delegate void PubComputer(string magazineName); //事件所需的代理 委托是种类
4
public delegate void PubLife(string magazineName);
5
public event PubComputer OnPubComputer=null;//事件的声明
6
public event PubLife OnPubLife=null;
7
public void issuComputer() //触发电脑杂志发行事件的方法
8
{
9
if(OnPubComputer!=null)
10
{
11
Console.WriteLine("发行《电脑》杂志");
12
OnPubComputer("《电脑》杂志"); //必须和事件代理参数一致
13
Console.ReadLine();
14
}
15
}
16
17
public void issuLife()
18
{
19
if(OnPubLife!=null)
20
{
21
Console.WriteLine("发行《生活》杂志");
22
OnPubLife("《生活》杂志");
23
Console.ReadLine();
24
}
25
}
26
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这里面有两个触发事件的方法issuComputer和issuLife;
接着定义事件的订阅者(接受者)
1
class Subscriber //订阅者
2
{
3
private string name;
4
public Subscriber(string name)
5
{
6
this.name=name;
7
}
8
public void Receive(string magazineName)//在事件订阅者中定义事件处理程序
9
{
10
Console.WriteLine(name+"已经收到了"+magazineName);
11
}
12
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Receive方法通过委托方式,在事件触发时自动执行
最后我们就可以演义出版商(publisher)和订户(subcriber)之间的故事(story)了
1
class Story //故事发生在订阅者和出版社之间
2
{
3
static void Main()
4
{
5
Publisher Pub=new Publisher();
6
Subscriber zs=new Subscriber("张三");
7
Pub.OnPubLife+=new Publisher.PubLife(zs.Receive);//张三订阅生活杂志
8
Subscriber ls=new Subscriber("李四");//李四也订阅了电脑、生活杂志
9
Pub.OnPubComputer+=new Publisher.PubComputer(ls.Receive);
10
Pub.OnPubLife+=new Publisher.PubLife(zs.Receive);
11
Pub.issuComputer(); //收到事件后做出的处理
12
Pub.issuLife();
13
//一年后张三由于经济危机取消了《生活》杂志的订阅
14
Console.WriteLine("一年后经济危机
");
15
Pub.OnPubLife-=new Publisher.PubLife(zs.Receive);
16
Pub.issuComputer();
17
Pub.issuLife();
18
}
19
}
转载自:http://www.cnblogs.com/hemood/archive/2008/11/27/1342582.html#1385050
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)