编程语言
221
事件可以看作是用户的一系列操作,例如点击键盘的某个按键、单击/移动鼠标等,当事件发生时我们可以针对事件做出一系列的响应,例如退出程序、记录日志等等。 C# 中线程之间的通信就是使用事件机制实现的。
事件需要在类中声明和触发,并通过委托与事件处理程序关联。事件可以分为发布器和订阅器两个部分,其中发布器是一个包含事件和委托的对象,事件和委托之间的联系也定义在这个类中,发布器类的对象可以触发事件,并使用委托通知其他的对象;订阅器则是一个接收事件并提供事件处理程序的对象,发布器类中的委托调用订阅器类中的方法(事件处理程序)。
有关事件需要注意以下几点:
- 发布器确定何时触发事件,订阅器确定对事件作出何种响应;
- 一个事件可以拥有多个订阅器,同时订阅器也可以处理来自多个发布器的事件;
- 没有订阅器的事件永远也不会触发;
- 事件通常用于定义针对用户的操作,例如单击某个按钮;
- 如果事件拥有多个订阅器,当事件被触发时会同步调用所有的事件处理程序;
- 在 .NET 类库中,事件基于 EventHandler 委托和 EventArgs 基类。
若要在类中声明一个事件,首先需要为该事件声明一个委托类型,例如:
public delegate void delegate_name(string status);
然后使用 event 关键字来声明事件本身,如下所示:
// 基于上面的委托定义事件 public event delegate_name event_name;
上例中定义了一个名为 delegate_name 和名为 event_name 的事件,当事件触发的时侯会调用委托。 下面通过一个具体的示例来演示事件的使用
using System; namespace xiaobai { class Demo { static void Main(string[] args){ PublisherDemo e = new PublisherDemo(); /* 实例发布器类*/ SubscriberDemo v = new SubscriberDemo(); /* 实例订阅器类 */ e.MyEvent += new PublisherDemo.MyEntrust( v.printf ); e.SetValue("hello"); } } /***********发布器类***********/ public class PublisherDemo{ private string value; public delegate void MyEntrust(string str); public event MyEntrust MyEvent; public void SetValue( string s ){ value = s; MyEvent(value); // 触发事件 } } /***********订阅器类***********/ public class SubscriberDemo{ public void printf(string str){ Console.WriteLine(str); } } }