规范的.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);
}
}
1
using System;
2
using System.Collections.Generic;
3
4
namespace 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
}
using System;2
using System.Collections.Generic;3

4
namespace event35
{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 magazineName16
{17
get{return m_magazineName;}18
}19
public DateTime pubDate20
{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
}


浙公网安备 33010602011771号