初学委托与事件

  本人最近在读《大话设计模式》这本书,由于没有C#的面向对象编程基础,所以先从附录的基础知识看起,我是在校大学生,在我们没有学习好面向对象编程的知识情况下,我们就开始了ASP.NET的学习,老师只是为了让我们实现功能而教我们,我自己深知没有理论和对面向对象的深入了解是不能做好ASP.NET的学习的,编出来的东西也是不成熟的,希望看的人以此为鉴。废话不多说了,接下来看我对学习委托与事件的理解,高手看到的话请多多指点,希望能帮助到那些学不懂委托与事件的同行理解其作用。

基本概念:

  委托:是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过。

    委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

  委托对象用关键字delegate来声明。

  public delegate void CatShoutEventHandler();

 

  而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知他们。

  事件对象用event关键字声明。

  public event CatShoutEventHandler CatShout;

接下来我们来看下书中老猫与老鼠的例子:

 CatShoutEventArgs.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8    public class CatShoutEventArgs:EventArgs//继承EventArgs
 9     {
10         private string name;
11 
12         public string Name
13         {
14          get { return name; }
15          set { name = value; }
16         }
17     }
18 }
Cat.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Cat
 9     {
10         private string name;
11         public Cat(string name)
12         {
13             this.name = name;
14         }
15         //声明委托CatShoutEventHandler,此时委托所代表的方法有两个参数,object参数和CatShoutEventArgs参数
16         public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs args);
17 
18         public event CatShoutEventHandler CatShout;//该CatShout事件的类型为CatShoutEventHandler,即为void型且带有两个形参
19 
20         public void Shout()//猫叫即触发猫叫事件
21         {
22             Console.WriteLine("喵,我是{0}",name);
23 
24             if (CatShout != null)
25             {
26                 CatShoutEventArgs e = new CatShoutEventArgs();//声明并实例化一个CatShoutEventArgs,并给Name属性赋值为猫的名字
27                 e.Name = this.name;
28                 CatShout(this,e);//当事件触发时,通知所有登记过的对象,并将发送通知的自己以及需要的数据传递过去(this-->class ConsoleApplication1.Cat)
29             }
30         }
31     }
32 }
Mouse.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Mouse
 9     {
10         private string name;
11         public Mouse(string name)
12         {
13             this.name = name;
14         }
15         public void Run(object sender, CatShoutEventArgs args)//object sender是传递事件的对象,CatShoutEventArgs args是事件,其中包含发送该事件的对象的信息
16         {
17             Console.WriteLine("叫声传播中,请按回车!");
18             Console.ReadLine();
19             Console.WriteLine("老猫{0}来了,{1}快跑!",args.Name,name);
20         }
21     }
22 }
ConsoleApplication
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using DelegateAndEvent;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //实例化老猫Tom以及小老鼠Jerry和Jack
14             Cat cat = new Cat("Tom");
15             Mouse mouse1 = new Mouse("Jerry");
16             Mouse mouse2 = new Mouse("Jack");
17 
18             //表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。其中"+="表示"add_CatShout"的意思。
19             cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run); 
20             cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
21 
22             cat.Shout();//猫叫的时候通过委托将此事件通知mouse1,mouse2执行Run;猫叫不需要任何参数,属于自然生理现象。
23             Console.Read();
24         }
25     }
26 }

代码都以给出,里面加入了我个人的一些理解注释,若有错误的地方还请大家予以指出,非常愿意和大家进行交流。

建议大家看完之后自己动手做一下,加深理解,调试是一个帮助理解的好方式。

posted @ 2012-09-21 17:32  _嘻嘻哈哈_  阅读(233)  评论(1编辑  收藏  举报