<接着上一篇事件委托讲解>
.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
}

2

3

4

5



6

7



8

9

10

11



12

13

14

15

16



17



18

19

20



21



22

23

24

25

26



27

28

29

30

31

32

33



34

35

36



37

38

39

40

41

42



43

44

45



46

47

48

49

50

51



52

53

54

55

56

57

58



59

60

61

62

63

64

65

66



67

68

69



70

71

72

73



74

75

76

77

78

79



80

81



82

83

84

85

86

87

88

89

90

91


92

93

94

95

96

97
