我不聪明,学习C#中的“委托”和“事件”,我大概花了整整一天的时间,才算把这两者了解清楚了。
现在,我在这里把我的学习的思路记录下来,方便初学C#的同学,也方便以后我自己万一又犯迷糊了,好利用这篇文档重拾记忆……当然,文章里肯定有不少的错误,也希望各位大虾能够帮俺指正。谢谢啦。
这一次,我准备采用一个比较生动的方式来撰写我的BLOG,我的同学小苏给了我一个可以对屏幕进行录像的工具。这次我就利用它,来重复我的全部的操作过程……
录像的下载地址我会随后贴出来,我先在这里补充一些东西。
补充材料(来自录像):
实现一个Delegate(代理、委托)的步骤:



实例代码:
1
using
System;
2
3
namespace
MyTest
4
{
5
public delegate void TestDelegate(int x, int y);
6
class Class1
7
{
8
[STAThread]
9
static void Main(string[] args)
10
{
11
Class1 test = new Class1();
12
TestDelegate td = new TestDelegate(test.add);
13
td += new TestDelegate(test.sub);
14
td(10,5);
15
Console.ReadLine();
16
}
17
public void add(int a, int b)
18
{
19
Console.WriteLine(a+b);//这里结果应该是15
20
}
21
public void sub(int a, int b)
22
{
23
Console.WriteLine(a-b);//这里是5,让我们运行看看。
24
}
25
}
26
}

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

实现一个Event(事件)的步骤:
1
、定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2 、定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3 、定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4 、用event关键字定义事件对象,它同时也是一个delegate对象。
5 、用+ = 操作符添加事件到事件队列中(- = 操作符能够将事件从队列中删除)。
6 、在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7 、在适当的地方调用事件触发方法触发事件。
2 、定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3 、定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4 、用event关键字定义事件对象,它同时也是一个delegate对象。
5 、用+ = 操作符添加事件到事件队列中(- = 操作符能够将事件从队列中删除)。
6 、在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7 、在适当的地方调用事件触发方法触发事件。
实例代码:
1
using
System;
2
3
namespace
ConsoleApplication3
4
{
5
/**//// <summary>
6
/// Class1 的摘要说明。
7
/// </summary>
8
9
10
public delegate void CSProgram(object sender, System.EventArgs e);
11
12
public class Class1
13
{
14
/**//// <summary>
15
/// 应用程序的主入口点。
16
/// </summary>
17
[STAThread]
18
static void Main(string[] args)
19
{
20
Console.WriteLine("系统:CS游戏开始了!");
21
Console.WriteLine();
22
//生成游戏玩家小适
23
HeShi hs = new HeShi();
24
//生成POD
25
Pod pod = new Pod();
26
27
//制定监视
28
pod.PodEvent += new CSProgram(hs.KillPod);//STEP 5
29
30
//POD开始玩游戏
31
pod.MeetHeShi();
32
33
Console.WriteLine("系统:CS游戏结束。");
34
Console.ReadLine();
35
36
37
}
38
}
39
40
/**//// <summary>
41
/// 游戏玩家小适
42
/// </summary>
43
public class HeShi
44
{
45
public HeShi()//构造函数
46
{
47
Console.WriteLine("系统:生成CS玩家小适。");
48
Console.WriteLine("系统:玩家小适生成完成。");
49
Console.WriteLine();
50
}
51
52
public void KillPod(object sender, EventArgs e)
53
{
54
Console.WriteLine("小适:重狙!轰!!");
55
Pod podtemp = (Pod)sender;
56
podtemp.Life = podtemp.Life - 524;
57
System.Threading.Thread.Sleep(500);
58
Console.WriteLine();
59
Console.WriteLine("系统:POD中弹,现在生命值为:"+podtemp.Life);
60
Console.WriteLine();
61
}
62
}
63
64
/**//// <summary>
65
/// POD机器人的类
66
/// </summary>
67
public class Pod
68
{
69
public event CSProgram PodEvent;
70
71
private string name = "Tom";
72
private int life = 100;
73
public int Life//属性
74
{
75
get
76
{
77
return life;
78
}
79
set
80
{
81
life = value;
82
}
83
}
84
85
/**//// <summary>
86
/// 构造函数
87
/// </summary>
88
public Pod()
89
{
90
Console.WriteLine("系统:生成新的POD……");
91
Console.WriteLine("系统:POD生成完成!");
92
Console.WriteLine();
93
Console.WriteLine("POD的属性:姓名= "+name+",生命值= "+life+"。");
94
Console.WriteLine();
95
}
96
97
public void MeetHeShi()
98
{
99
System.Threading.Thread.Sleep(2500);
100
Console.WriteLine("系统:POD遇见小适……");
101
Console.WriteLine();
102
Console.WriteLine("POD "+name+":我要杀人!" );
103
System.EventArgs e = new EventArgs();
104
this.PodEvent(this, e);
105
106
}
107
}
108
}

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

OK,下面是重要的部分了:
1、委托Delegate的讲解VCR(37.5MB)已失效
2、事件Event的讲解VCR(42.2MB)已失效
3、所有VCR中实例的源代码(263KB)已失效

Feedback
2005-10-05 06:38 |
#
re: .NET入门:(5)委托和事件
2005-10-13 17:01 |
忧郁的龙卷风
呵呵,看了你的文章
基本上搞清楚了,委托是怎么实现
但是做什么用的了,我就不知道了
能解释一下吗?
谢谢!rojazz1999@gmail.com 回复
#
re: 委托和事件
2005-11-14 05:28 |
敏锐
您指出:
--6、在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
————————————————————————
因为在你给出的demo中找不到 方法OnPodEvent,所以我想有人一定感到疑惑的是吧?
还不算很perfect,建议写一个方法public virtual OnPodEvent(sender obj,EventArgs e);
然后在
public void MeetHeShi()
中直接调用。 这样结构也清楚,不需要在public void MeetHeShi()
中处理事件的参数。你可以把这些都放在public virtual OnPodEvent(..)中解决。
否则你的DEMO中的步骤就与你自己所说的这7个标题不符。初学者就更不明白了。
还有请注意一下命名的一些大家认可的做法,比如可以这样写
public event CSProgram OnPodEvent,那么事件的触发方法就是OnPodEvent(..),那么可以这样理解它pod.OnPodEvent += new CSProgram(hs.KillPod)
它的意思是当OnPodEvent(..)发生以后(接收参数),将回调EventHandler,即事件处理程序hs.KillPod().
如有不当,请海涵。 回复