首先举一个实例:
创建一个控制台程序,需求是:有一只猫Tom,有两只老鼠Jerry和Jack,Tom只叫一声“喵,我是Tom”,两只老鼠就说“老猫来了,快跑”,我们来分析一下:
我们需要Cat和Mouse类两个类,当Cat的Shout方法触发的时候,Mouse就执行Run方法,不过这里如何让Shout触发式,通知两只老鼠呢?显然老猫不会通知老鼠“我来了,你们快跑”。
所以,我们在Cat类中,不应该关联Mouse类的。这个时候,委托事件就是最好的处理方法了。
委托是对函数的封装,可以当作方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事件时,时间对象处理通知过程。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托用关键字delegate来声明,而事件就是说在发生其他类或者对象关注事件时,类或对象可通过事件通知他们,事件的关键字 用event声明。
1: class Cat2
2: {
3: private string name;
4: public Cat2(string name)
5: {
6: this.name = name;
7: }
8: public delegate void CatShoutEventHandler();
9: public event CatShoutEventHandler CatShout;
10: public void Shout()
11: {
12: Console.Write("喵,我是{0}.", name);
13: if (CatShout != null)
14: CatShout();
15: }
16: }
17:
18: class Mouse
19: {
20: private string name;
21: public Mouse(string name)
22: {
23: this.name = name;
24: }
25: public void Run()
26: {
27: Console.WriteLine("老猫来了,{0}快跑!", name);
28: }
29: }
30:
31: static void Main(string[] args)
32: {
33: Cat2 cat = new Cat2("Tom");
34: Mouse mouse1 = new Mouse("Jerry");
35: Mouse mouse2 = new Mouse("Jace");
36: cat.CatShout += new Cat2.CatShoutEventHandler(mouse1.Run);
37: cat.CatShout += new Cat2.CatShoutEventHandler(mouse2.Run);
38: cat.Shout();
39: Console.Read();
40: }
new Cat2.CatShoutEventHandler(mouse1.Run)的含义是实例化一个委托,而委托的实例其实就是Mouse的Run方法。而“cat.CahShout += ”表示
cat.add_CatShout(new Cat2.CatShoutEventHandler(mouse1.Run))的意思。
运行的结果:
我们平时在点击一个按钮的时候,通常看到这样子的东西:
private void button5_Click(object sender, EventArgs e)
这里的sender和e有什么用呢?
我们首先修改一下上面的例子
1: class Cat2
2: {
3: private string name;
4: public Cat2(string name)
5: {
6: this.name = name;
7: }
8: public delegate void CatShoutEventhandler(object sender, CatShoutEventArgs args);
9: public event CatShoutEventhandler CatShout;
10: public void Shout()
11: {
12: Console.Write("喵,我是{0}.", name);
13: if (CatShout != null)
14: {
15: CatShoutEventArgs e = new CatShoutEventArgs();
16: e.Name = this.name;
17: CatShout(this, e);
18: }
19: }
20: }
21:
22: class Mouse
23: {
24: private string name;
25: public Mouse(string name)
26: {
27: this.name = name;
28: }
29: public void Run(object sender, CatShoutEventArgs args)
30: {
31: Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
32: }
33: }
Main函数不变。这个时候的结果是: