规范的.net 事件原理
<接着上一篇事件委托讲解>
.net framework 事件设计准则
1 声明delegate时,使用void 类型当作返回值,EventName事件的事件委托是
EventNameEventHandler,事件接受两个传入参数,一律命名为sender和e。
2 定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从system.EventArgs派生该
类,然后添加所有事件特定的成员
public delegate void EventNameEventHandler(object sender,EventNameEventArgs e);
EventNameEventArgs用于封装事件的多个参数,这个类可以自己写但必须继承EventArgs
class EventNameEventArgs:EventArgs
{
...
}
3 在引发事件的类中提供一个手保护的方法,以OnEventName进行命名。在该方法中引发事件
protected virtual void OnEventName(EventArgs e)
{
if(EventName!=null)
{
EventName(this,e);
}
}
1using System;
2using System.Collections.Generic;
3
4namespace event3
5{
6 class PubEventArgs:EventArgs//提供事件所需要的数据
7 {
8 private readonly string m_magazineName;
9 private readonly DateTime m_pubDate;
10 public PubEventArgs(string magazineName,DateTime pubDate)
11 {
12 this.m_magazineName=magazineName;
13 this.m_pubDate=pubDate;
14 }
15 public string magazineName
16 {
17 get{return m_magazineName;}
18 }
19 public DateTime pubDate
20 {
21 get{return m_pubDate;}
22 }
23 }
24
25 class Publisher //出版社
26 {
27 public delegate void PubComputerEventHandler(object sender,PubEventArgs e); //事件所需的代理 委托是种类
28 public delegate void PubLifeEventHandler(object sender,PubEventArgs e);
29 public event PubComputerEventHandler PubComputer=null;//事件的声明
30 public event PubLifeEventHandler PubLife=null;
31
32 protected virtual void OnPubComputer(PubEventArgs e)
33 {
34 PubComputerEventHandler handler=PubComputer; //临时委托变量
35 if(handler!=null)
36 {
37 handler(this,e);
38 }
39 }
40
41 protected virtual void OnPubLife(PubEventArgs e)
42 {
43 PubLifeEventHandler handler=PubLife; //临时委托变量
44 if(handler!=null)
45 {
46 handler(this,e);
47 }
48 }
49
50 public void issuComputer(string magazineName,DateTime pubDate) //触发订阅电脑杂志事件的方法
51 {
52 Console.WriteLine("发行"+magazineName);
53 OnPubComputer(new PubEventArgs(magazineName,pubDate));
54 Console.ReadLine();
55 }
56
57 public void issuLife(string magazineName,DateTime pubDate)
58 {
59 Console.WriteLine("发行"+magazineName);
60 OnPubLife(new PubEventArgs(magazineName,pubDate));
61 Console.ReadLine();
62 }
63 }
64
65 class Subscriber //订阅者
66 {
67 private string name;
68 public Subscriber(string name)
69 {
70 this.name=name;
71 }
72 public void Receive(object sender,PubEventArgs e)//在事件订阅者中定义事件处理程序
73 {
74 Console.WriteLine(e.pubDate+" "+name+"已经收到了"+e.magazineName);
75 }
76 }
77
78 class Story //故事发生在订阅者和出版社之间
79 {
80 static void Main()
81 {
82 Publisher Pub=new Publisher();
83 Subscriber zs=new Subscriber("张三");
84 Pub.PubLife+=new Publisher.PubLifeEventHandler(zs.Receive);//张三订阅生活杂志
85 Subscriber ls=new Subscriber("李四");//李四也订阅了电脑、生活杂志
86 Pub.PubComputer+=new Publisher.PubComputerEventHandler(ls.Receive);
87 Pub.PubLife+=new Publisher.PubLifeEventHandler(ls.Receive);
88 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2008-11-28")); //收到事件后做出的处理
89 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2008-11-28"));
90 //一年后李四由于经济危机取消了《生活》杂志的订阅
91 Console.WriteLine("一年后李四由于经济危机取消了《生活》杂志的订阅");
92 Pub.PubLife-=new Publisher.PubLifeEventHandler(ls.Receive);
93 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2009-11-28"));
94 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2009-11-28"));
95 }
96 }
97}
2using System.Collections.Generic;
3
4namespace event3
5{
6 class PubEventArgs:EventArgs//提供事件所需要的数据
7 {
8 private readonly string m_magazineName;
9 private readonly DateTime m_pubDate;
10 public PubEventArgs(string magazineName,DateTime pubDate)
11 {
12 this.m_magazineName=magazineName;
13 this.m_pubDate=pubDate;
14 }
15 public string magazineName
16 {
17 get{return m_magazineName;}
18 }
19 public DateTime pubDate
20 {
21 get{return m_pubDate;}
22 }
23 }
24
25 class Publisher //出版社
26 {
27 public delegate void PubComputerEventHandler(object sender,PubEventArgs e); //事件所需的代理 委托是种类
28 public delegate void PubLifeEventHandler(object sender,PubEventArgs e);
29 public event PubComputerEventHandler PubComputer=null;//事件的声明
30 public event PubLifeEventHandler PubLife=null;
31
32 protected virtual void OnPubComputer(PubEventArgs e)
33 {
34 PubComputerEventHandler handler=PubComputer; //临时委托变量
35 if(handler!=null)
36 {
37 handler(this,e);
38 }
39 }
40
41 protected virtual void OnPubLife(PubEventArgs e)
42 {
43 PubLifeEventHandler handler=PubLife; //临时委托变量
44 if(handler!=null)
45 {
46 handler(this,e);
47 }
48 }
49
50 public void issuComputer(string magazineName,DateTime pubDate) //触发订阅电脑杂志事件的方法
51 {
52 Console.WriteLine("发行"+magazineName);
53 OnPubComputer(new PubEventArgs(magazineName,pubDate));
54 Console.ReadLine();
55 }
56
57 public void issuLife(string magazineName,DateTime pubDate)
58 {
59 Console.WriteLine("发行"+magazineName);
60 OnPubLife(new PubEventArgs(magazineName,pubDate));
61 Console.ReadLine();
62 }
63 }
64
65 class Subscriber //订阅者
66 {
67 private string name;
68 public Subscriber(string name)
69 {
70 this.name=name;
71 }
72 public void Receive(object sender,PubEventArgs e)//在事件订阅者中定义事件处理程序
73 {
74 Console.WriteLine(e.pubDate+" "+name+"已经收到了"+e.magazineName);
75 }
76 }
77
78 class Story //故事发生在订阅者和出版社之间
79 {
80 static void Main()
81 {
82 Publisher Pub=new Publisher();
83 Subscriber zs=new Subscriber("张三");
84 Pub.PubLife+=new Publisher.PubLifeEventHandler(zs.Receive);//张三订阅生活杂志
85 Subscriber ls=new Subscriber("李四");//李四也订阅了电脑、生活杂志
86 Pub.PubComputer+=new Publisher.PubComputerEventHandler(ls.Receive);
87 Pub.PubLife+=new Publisher.PubLifeEventHandler(ls.Receive);
88 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2008-11-28")); //收到事件后做出的处理
89 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2008-11-28"));
90 //一年后李四由于经济危机取消了《生活》杂志的订阅
91 Console.WriteLine("一年后李四由于经济危机取消了《生活》杂志的订阅");
92 Pub.PubLife-=new Publisher.PubLifeEventHandler(ls.Receive);
93 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2009-11-28"));
94 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2009-11-28"));
95 }
96 }
97}