1
代理的实现过程。
2
代理其实就是方法的传递,并不定义方法的实现。事件其实就是标准化了的代理,为了事件处理过程特制的、稍微专业化一点的组播代理(多点代理)。看下面的例子,把代理的例子和事件的例子比较,容易理解。
3
using System;
4
5
class Class1
6
{
7
delegate int MathOp(int Num1, int Num2);
8
static void Main(string[] args)
9
{
10
MathOp op1 = new MathOp(Add);
11
MathOp op2 = new MathOp(Multiply);
12
Console.WriteLine(op1(100, 200));
13
Console.WriteLine(op2(100, 200));
14
Console.ReadLine();
15
}
16
public static int Add(int Num1, int Num2)
17
{
18
return Num1 + Num2;
19
}
20
public static int Multiply(int Num1, int Num2)
21
{
22
return Num1 * Num2;
23
}
24
}
25
26
27
28
首先代码定义了一个代理MathOp,其签名匹配与两个函数Add()和Multiply()的签名(也就是其带的参数类型数量相同):
29
delegate int MathOp(int Num1, int Num2);
30
31
Main()中代码首先使用新的代理类型声明一个变量,并且初始化代理变量.注意,声明时的参数只要使用代理传递的函数的函数名,而不加括号:
32
MathOp op1 = new MathOp(Add);
33
代理传递的函数的函数体:
34
public static int Add(int Num1, int Num2)
35
{
36
return Num1 + Num2;
37
}
38
public static int Multiply(int Num1, int Num2)
39
{
40
return Num1 * Num2;
41
}
42
43
44
然后把代理变量看作是一个函数名,将参数传递给函数。
45
46
Console.WriteLine(op1(100, 200));
47
48
2.事件的实现过程
49
using System;
50
51
class Class1
52
{
53
static void Main(string[] args)
54
{
55
Student s1 = new Student();
56
Student s2 = new Student();
57
s1.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
58
s2.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
59
s1.Register();
60
s2.Register();
61
Console.ReadLine();
62
}
63
static void Student_RegisterOK()
64
{
65
Console.WriteLine("Hello");
66
}
67
}
68
69
class Student
70
{
71
public delegate void DelegateRegisterOkEvent();
72
public event DelegateRegisterOkEvent RegisterOK;
73
public void Register()
74
{
75
Console.WriteLine("Register Method");
76
RegisterOK();
77
}
78
}
79
80
81
在Student类中,先声明了代理DelegateRegisterOkEvent(),然后使用event和要使用的代理类型(前面定义的DelegateRegisterOkEvent代理类型)声明事件RegisterOK(可以看作是代理的一个实例。):
82
public delegate void DelegateRegisterOkEvent();
83
public event DelegateRegisterOkEvent RegisterOK;
84
然后在Main()函数中,实例化Student类,然后s1.RegisterOK事件代理给了Student_RegisterOK 方法。通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。
85
然后,当调用s1.Register()时,事件s1.RegisterOK发生。
86
87
3.C#中预定义事件处理方式
88
学习事件,我觉得最不好理解的就是C#中预定义了事件,使我才开始学习事件时一头雾水。在查了些资料后,终于弄明白了一些,如下:
89
EventArgs是包含事件数据的类的基类,用于传递事件的细节。
90
EventHandler是一个代理声明如下(其在.Net类库中如下声明的)
91
public delegate void EventHandler( object sender , EventArgs e ) 所以,所有形如:
92
void 函娄名(object 参数名,EventArgs 参数名);
93
的函数都可以作为Control类的Click事件响应方法了。如下面所定义的一个事件响应方法:
94
private void button1_Click(object sender, System.EventArgs e)
95
参数object sender表示引发事件的对象,(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1)System.EventArgs e 代表事件的相应信息,如鼠标的x,y值等。
96
下面我们研究一下Button类看看其中的事件声明,以Click事件为例。
97
public event EventHandler Click;
98
这里定义了一个EventHandler类型的事件Click
99
private void button1_Click(object sender, System.EventArgs e)
100
{
101
102
}
103
104
105
这是我们和button1_click事件所对应的方法。注意方法的参数符合代理中的签名(既参数列表)。那我们怎么把这个方法和事件联系起来呢,请看下面的代码。
106
this.button1.Click += new System.EventHandler(this.button1_Click); (其实button1.Click 为System.EventHandler代理的实例事件。与代理中代理实例代理给某一方法非常相似)
107
把this.button1_Click方法绑定到this.button1.Click事件。
108
109
4.事件参数的使用。
110
111
112
using System;
113
114
class Class1
115
{
116
static void Main()
117
{
118
Student s1 = new Student();
119
s1.Name = "Student1";
120
Student s2 = new Student();
121
s2.Name = "Student2";
122
s1.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
123
s2.RegisterOK += new Student.DelegateRegisterOkEvent(Student_RegisterOK);
124
125
//当Register方法一执行,触发RegisterOK事件
126
//RegisterOK事件一触发,然后执行Student_RegisterOK方法
127
s1.Register();
128
s2.Register();
129
Console.ReadLine();
130
}
131
static void Student_RegisterOK(RegisterOkArgs e)
132
{
133
Console.WriteLine(e.EventInfo);
134
}
135
}
136
137
class Student
138
{
139
public delegate void DelegateRegisterOkEvent(RegisterOkArgs e);
140
public event DelegateRegisterOkEvent RegisterOK;
141
public string Name;
142
public void Register()
143
{
144
Console.WriteLine("Register Method");
145
RegisterOK(new RegisterOkArgs("Student Name: " + Name));
146
}
147
}
148
class RegisterOkArgs : EventArgs
149
{
150
public string EventInfo;
151
public RegisterOkArgs(string eventInfo): base()
152
{
153
this.EventInfo = eventInfo;
154
}
155
}
156

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

98

99

100

101


102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156
