本人最近在读《大话设计模式》这本书,由于没有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 }
代码都以给出,里面加入了我个人的一些理解注释,若有错误的地方还请大家予以指出,非常愿意和大家进行交流。
建议大家看完之后自己动手做一下,加深理解,调试是一个帮助理解的好方式。