首先举一个实例:
创建一个控制台程序,需求是:有一只猫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函数不变。这个时候的结果是:
![]()