你的位置:首页 > ASP.net教程

[ASP.net教程][.net 面向对象编程基础] 事件


[.net 面向对象编程基础] (22)  事件

   事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是.net设计控件的时候已经定义好的事件。除此之外,我们同样可以自己定义事件。

   事件实际上是一种消息机制,当然点击控件时,click就通知处理他的方法去处理,实际上就是前面说的委托。因此我们可以说:事件是一种具有特殊签名的委托。而事件/消息机制是windows的核心,因此我们必须掌握他。

   为了更加容易理解事件,我们还是使用前面的动物的示例来说明,有两三只动物,猫(名叫Tom),还有两只老鼠(Jerry和Jack),当猫叫的时候,触发事件(CatShout),然后两只老鼠开始逃跑(MouseRun)。在使用代码实现这个示例之前,我们先看一下事件的书面定义. 

1.什么是事件(Event)? 

 事件(Event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托. 

2.事件的声明 

public event 委托类型 事件名; 

事件使用event关键词来声明,他的返回类值是一个委托类型。 

通常事件的命名,以名字+Event 作为他的名称,在编码中尽量使用规范命名,增加代码可读性。 

3.事件示例 

下面我们实现本篇开始的猫捉老鼠的示例 

首先看一下UML图 

  

如上UML类图,有猫(Cat)和老鼠(Mouse)两个类,里面包含其成员.当猫叫(CatShout)时,触发事件(CatShoutEvent),事件通知老鼠,然后老鼠跑路(MouseRun). 

 两个类的代码如下:

 1   class Cat 2   { 3     string catName; 4     string catColor { get; set; } 5     public Cat(string name, string color) 6     { 7       this.catName = name; 8       catColor = color; 9     }10     11     public void CatShout()12     {13       Console.WriteLine(catColor+" 的猫 "+catName+" 过来了,喵!喵!喵!\n");14 15       //猫叫时触发事件16       //猫叫时,如果CatShoutEvent中有登记事件,则执行该事件17       if (CatShoutEvent != null)18         CatShoutEvent();19     }20 21     public delegate void CatShoutEventHandler();22 23     public event CatShoutEventHandler CatShoutEvent;24 25   }26   class Mouse27   {28     string mouseName;29     string mouseColor { get; set; }30     public Mouse(string name, string color)31     {32       this.mouseName = name;33       this.mouseColor = color;34     }35 36     public void MouseRun()37     {38       Console.WriteLine(mouseColor + " 的老鼠 " + mouseName + " 说:\"老猫来了,快跑!\" \n我跑!!\n我使劲跑!!\n我加速使劲跑!!!\n");39     }40   }

调用如下:

 1       Console.WriteLine("[场景说明]: 一个月明星稀的午夜,有两只老鼠在偷油吃\n"); 2       Mouse Jerry = new Mouse("Jerry", "白色"); 3       Mouse Jack = new Mouse("Jack", "黄色"); 4  5  6       Console.WriteLine("[场景说明]: 一只黑猫蹑手蹑脚的走了过来\n"); 7       Cat Tom = new Cat("Tom", "黑色"); 8  9       Console.WriteLine("[场景说明]: 为了安全的偷油,登记了一个猫叫的事件\n");10       Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jerry.MouseRun);11       Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jack.MouseRun);12 13       Console.WriteLine("[场景说明]: 猫叫了三声\n");14       Tom.CatShout();15 16 17       Console.ReadKey();

运行结果如下:

4.事件参数

 上面的事件是最简单的事件,通过我们看到的事件,都会带两个参数,比如c# winform中的button点击事件的委托方法如下:

 private void button1_Click(object sender, EventArgs e) 

带有两个参数,不熟悉事件参数的小伙伴肯定要问,这两个参数sender和e到底有什么用呢?
第一个参数 sender,其中object类型的参数 sender表示的是发送消息的对象,为什么要使用object类型呢,这是因为不同类型的对象调用时使用object能很好的兼容。 

第二个参数 e,他的类型为EventArgs.EventArgs这个类没有实际的用途,只是作为一个基类让其他对象继承。很多对象不需要传递额外的信息,例如按钮事件,只是调用一个回调方法就够了。当我们定义的事件不需要传递额外的信息时,这时调用EventArgs.Empty就行了,不需要重新构建一个EventArgs对象。

 

我们可以看到在Button事件登记时,只传了一个参数sender

为了更好的理解带参数的事件,我们改写一下上面猫捉老鼠的示例: 

先看UML图:

实现代码如下:

 1  class Cat 2   { 3     string catName; 4     string catColor { get; set; } 5     public Cat(string name, string color) 6     { 7       this.catName = name; 8       catColor = color; 9     }10     11     public void CatShout()12     {13       Console.WriteLine(catColor+" 的猫 "+catName+" 过来了,喵!喵!喵!\n");14 15       //猫叫时触发事件16       //猫叫时,如果CatShoutEvent中有登记事件,则执行该事件17       if (CatShoutEvent != null)18         CatShoutEvent(this, new CatShoutEventArgs() {catName=this.catName, catColor=this.catColor});19     }20 21     public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs e);22 23     public event CatShoutEventHandler CatShoutEvent;24 25   }26 27   /// <summary>28   /// EventArgs类的作用就是让事件传递参数用的29   /// 我们定义一个类CatShout包含两个成员属性,以方便传递30   /// </summary>31   class CatShoutEventArgs:EventArgs32   {33    public string catColor { get; set; }34    public string catName { get; set; }35   }36 37   class Mouse38   {39     string mouseName;40     string mouseColor { get; set; }41     public Mouse(string name, string color)42     {43       this.mouseName = name;44       this.mouseColor = color;45     }46 47     public void MouseRun(object sender, CatShoutEventArgs e)48     {49       if (e.catColor == "黑色")50         Console.WriteLine(mouseColor + " 的老鼠 " + mouseName + " 说:\" " + e.catColor + " 猫 " + e.catName + " 来了,快跑!\" \n我跑!!\n我使劲跑!!\n我加速使劲跑!!!\n");51       else52         Console.WriteLine(mouseColor + " 的老鼠 " + mouseName + " 说:\" " + e.catColor + " 猫 " + e.catName + " 来了,慢跑!\" \n我跑!!\n我慢慢跑!!\n我慢慢悠悠跑!!!\n");53 54     }55   }

调用如下:

 1 Console.WriteLine("[场景说明]: 一个月明星稀的午夜,有两只老鼠在偷油吃\n\n\n"); 2 Mouse Jerry = new Mouse("Jerry", "白色"); 3 Mouse Jack = new Mouse("Jack", "黄色"); 4  5  6 Console.WriteLine("[场景说明]: 一只黑猫蹑手蹑脚的走了过来"); 7 Cat Tom = new Cat("Tom", "黑色"); 8 Console.WriteLine("[场景说明]: 为了安全的偷油,登记了一个猫叫的事件"); 9 Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jerry.MouseRun);10 Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jack.MouseRun);11 Console.WriteLine("[场景说明]: 猫叫了三声\n");12 Tom.CatShout();13 14 Console.WriteLine("\n\n\n");15 16 //当其他颜色的猫过来时17 Console.WriteLine("[场景说明]: 一只蓝色的猫蹑手蹑脚的走了过来");18 Cat BlueCat = new Cat("BlueCat", "蓝色");19 Console.WriteLine("[场景说明]: 为了安全的偷油,登记了一个猫叫的事件");20 BlueCat.CatShoutEvent += new Cat.CatShoutEventHandler(Jerry.MouseRun);21 BlueCat.CatShoutEvent += new Cat.CatShoutEventHandler(Jack.MouseRun);22 Console.WriteLine("[场景说明]: 猫叫了三声");23 BlueCat.CatShout();

运行结果如下:

也可以使用前面学过的Lamda表达式来简洁的写以上的事件注册

Cat Doraemon = new Cat("哆啦A梦", "彩色");Doraemon.CatShoutEvent += (sender, e) => Jerry.MouseRun(sender, e);Doraemon.CatShoutEvent += (sender, e) => Jack.MouseRun(sender, e);Doraemon.CatShout();

调用后结果一样.

 

<未完待续,后面会进一步说明事件的其他引用>

 ============================================================================================== 

返回目录

 <如果对你有帮助,记得点一下推荐哦,有不明白的地方或写的不对的地方,请多交流>
 

QQ群:467189533

==============================================================================================