C# 事件机制

转载 2007年09月21日 23:43:00

本文转自:http://www.cnblogs.com/donghaiyiyu/archive/2007/07/29/828738.html   文中言简意赅,切中要害,举例准确形象,使读者对于C#的事件机制一目了然,在此对作者表示感谢。

在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(Publisher/Subscriber)这种描述。理解事件机制并不是一件容易的事情,它所涉及的思想值得我们好好去研究。

本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社

谈到事件,我们涉及到两个角色:事件发布者(Publisher)和事件订阅者(Scriber),也可以说是事件发送者(Sender)和事件接收者(Receiver)的关系。举个例子来说,市面上目前有许多杂志,杂志的种类也很多。而我只对其中的某些感兴趣,那么我就可以向杂志发行商提出订阅。之后,每当杂志发行时,我就会收到我在杂志发行商那儿订阅的杂志。在这个关系中,杂志发行商就相当于事件发行者,而我就是事件订阅者。每当杂志发行时,就触发了一个发行事件。

用面向对象的语言解释,这两者的意义如下:

事件发行者(Publisher)

它是一个对象,且会维护自身的状态信息。每当状态信息发生变动时,便触发一个事件,并通知所有的事件订阅者。对于杂志发行商来说,每本杂志都有自己的信息在里面,当杂志发行时,我要通知订阅该杂志的人:杂志已经发行啦,请注意查收!

事件接收者(Receiver)

这个对象要注册它感兴趣的对象,也就是订阅它自己喜欢的杂志啦。另外,这个对象通常要提供一个事件处理方法,在事件发行者触发一个事件后,会自动执行这个方法。对于上面所举的例子来说,也就是我收到杂志后要做什么事情,比如,你可以满世界地大喊:我收到杂志啦!也可以将杂志收藏起来慢慢欣赏,具体怎么实现完全取决你自己的喜好。

以下是.NET事件处理机制的模型:

 

 下面给一个简单的例子,用以阐述事件的思想:

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace EventDemo
 6{
 7       public delegate void SalaryCompute();        //声明一个代理类
 8
 9       public class Employee
10       {
11              public event SalaryCompute OnSalaryCompute;         //定义事件,将其与代理绑定
12
13              public virtual void FireEvent()       //触发事件的方法
14              {
15                     if (OnSalaryCompute != null)
16                     {
17                            OnSalaryCompute();      //触发事件
18                     }

19              }

20       }

21
22       public class HumanResource
23       {
24              public void SalaryHandler()          //事件处理函数
25              {
26                     Console.WriteLine("Salary");     //只是打印一行字而已
27              }

28
29              public static void Main()
30              {
31                     Employee ep = new Employee();
32                     HumanResource hr = new HumanResource();
33                     ep.OnSalaryCompute+=new SalaryCompute(hr.SalaryHandler);       //注册
34                     ep.FireEvent();        //触发事件
35                     Console.Read();
36              }

37       }

38}

39
在这个例子中,Employee类相当于一个事件发布者(Publisher),它定义了事件的相关信息,包括定义了一个事件用于计算薪水(OnSalaryCompute),以及一个触发事件的函数(FireEvent()),为简单起见,本例没有加上事件参数。

与之相对应,HumanResource类则相当于一个事件订阅者(Subscriber),它定义了一个事件处理函数(SalaryHandler()),并用+=将其与事件联系起来,从而使事件触发的时候能够调用我这个方法(在本例中也就是打印一行字啦)。值得注意的一点是,事件处理函数的方法签名要与代理的方法签名相同,这是非常重要的一点。

下面将这个例子改造一下,事件参数信息,用以完善事件机制。

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Threading;
 5
 6namespace EventDemo
 7{
 8       public delegate void SalaryCompute(object sender,MyEventArgs e);        //声明一个代理类
 9
10       public class Employee
11       {
12              public event SalaryCompute OnSalaryCompute;         //定义事件,将其与代理绑定
13
14              public virtual void FireEvent(MyEventArgs e)       //触发事件的方法
15              {
16                     if (OnSalaryCompute != null)
17                     {
18                            OnSalaryCompute(this,e);      //触发事件
19                     }

20              }

21       }

22
23       public class MyEventArgs : EventArgs         //定义事件参数类
24       {
25              public readonly double _salary;
26              public MyEventArgs(double salary)
27              {
28                     this._salary = salary;
29              }

30       }

31
32       public class HumanResource
33       {
34              public void SalaryHandler(object sender,MyEventArgs e)          //事件处理函数,其签名应与代理签名相同
35              {
36                     Console.WriteLine("Salary is {0}",e._salary);     //只是打印一行字而已
37              }

38
39              public static void Main()
40              {
41                     Employee ep = new Employee();
42                     HumanResource hr = new HumanResource();
43                     MyEventArgs e = new MyEventArgs(123.40);
44                     ep.OnSalaryCompute+=new SalaryCompute(hr.SalaryHandler);       //注册
45                     for (; ; )
46                     {
47                            Thread.Sleep(1000);      //让程序“睡”一秒
48                            ep.FireEvent(e);        //触发事件
49                     }

50                     //Console.Read();
51              }

52       }

53}

54

这个例子很有意思,它一秒钟自动触发事件一次,比上一个例子更能解释事件的机制,对吧?在这个例子中,我们要注意的一个地方就是事件处理函数的签名要和代理的签名一致  

理解事件机制

 在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(Publisher/Subscriber)这种描述。理解事件机制并不是一件容易的事情,它所涉及的思想值得我们好好去研究。 本文资...
  • shuiyingzi5
  • shuiyingzi5
  • 2013年12月17日 16:21
  • 655

C# 事件机制

在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(Publisher/Subscriber)这种描述。理解事件机制并不是一件容易的事情,它所涉及的思想值得我们好好去研究。本文资源来自《C#与....
  • mane_yao
  • mane_yao
  • 2010年06月07日 11:11
  • 399

C#,由委托到Observer设计模式,再到事件机制

1. 什么是委托? 开始处理诸如int,bool等基本数据类型,它们是数据的类型。委托,是方法的类型。 如  int a; a可以是1,2,3,4,5......... 那么 delegate D; ...
  • u013781568
  • u013781568
  • 2014年03月01日 11:30
  • 998

C#事件机制

定义一个事件成员,表示该类型提供了如下功能: 1.能够在事件中注册方法   2.能够在事件中注销方法   3.当事件发生时,注册的方法会被通知 (事件内部维护了一个注册方法列表) CLR的事件模...
  • binbingg
  • binbingg
  • 2013年09月06日 15:29
  • 586

C# 事件机制

转自:http://www.cnblogs.com/donghaiyiyu/archive/2007/07/29/828738.html 在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(...
  • penaiyan
  • penaiyan
  • 2013年09月12日 21:01
  • 634

c# 事件机制

事件涉及到两类角色---1.发布者 2.订阅者 简单例子:气象观测站【发布者】发布气象预告,电视台【订阅者】接受天气情况的报告 1.事件的定义 public event 委托类型 事件名;...
  • feipeixuan
  • feipeixuan
  • 2015年08月04日 12:54
  • 244

JavaScript事件机制详解

一、事件处理程序 a.     DOM0级事件处理程序,被认为是元素的方法。   在事件处理程序中,通过this访问元素的任何属性和方法。 b.    DOM2级事件处理程序 DOM2级事件定义...
  • lysunnyrain
  • lysunnyrain
  • 2016年03月16日 10:54
  • 825

Java事件机制理解及应用

1.从总体看事件机制其实事件机制是一种处理世界的方式和方法。传统的顺序程序设计总是按照流程来安排所做的工作,而事件机制的特点在于:等待,如果有事情发生则处理之。这样的好处是顺序程序设计在没有事情做的时...
  • JianZhiZG
  • JianZhiZG
  • 2006年12月02日 20:39
  • 12495

C#事件机制及响应方法

C#语言自C/C++演变而来。它是现代、简单、完全面向对象和类型安全的。C#语言是微软公司针对.Net平台才推出来的一门新语言,作为.Net平台的第一语言,它几乎集中了所有关于软件开发和软件工程研究的...
  • vsweaver
  • vsweaver
  • 2006年08月01日 16:25
  • 1268

ie事件机制和火狐事件机制

事件机制 事件冒泡:事件从当前元素对象触发,然后向上层元素搜索相同对象事件并触发(直搜到document节点)。IE事件默认都只这种类型的事件。 事件捕获:从document节点开始搜索事件,然后...
  • sinat_32067081
  • sinat_32067081
  • 2017年03月28日 10:27
  • 1528
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 事件机制
举报原因:
原因补充:

(最多只允许输入30个字)