类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。
事件具有以下特点:
· 发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
· 一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。
· 没有订户的事件永远也不会引发。
· 事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。
· 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
· 可以利用事件同步线程。
· 在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。
实例如下:
首先我们先定义一个发行者Pulisher,其中定义了事件Add及触发事件的方法ExecuteAdd。
{
//定义事件
public event AddEventHandler Add;
//触发事件的发法
public void ExecuteAdd(int a, int b)
{
if (Add != null)
//// 触发事件
Add(a, b);
Console.Read();
}
}
注意: 事件应该由事件发布者触发.
其次,我们定义二个订户Subscriber1及Subscriber2,为其分别定义事件的处理程序OnAdd及OnExtraAdd.
{
//事件的处理程序
public void OnAdd(int a, int b)
{
Console.WriteLine((a + b).ToString());
}
}
public class Subscriber2
{
//事件的处理程序
public void OnExtraAdd(int a, int b)
{
Console.WriteLine((a + b + 5).ToString());
}
}
static void Main(string[] args)
{
Pulisher p = new Pulisher();
Subscriber1 s = new Subscriber1();
Subscriber2 s = new Subscriber2();
//给事件注册处理的程序
p.Add += new AddEventHandler(s1.OnAdd);
p.Add += new AddEventHandler(s2.OnExtraAdd);
//调用事件
p.ExecuteAdd(3, 5);
//给事件注销处理的程序
p.Add -= new AddEventHandler(s1.OnAdd);
//调用事件
p.ExecuteAdd(3, 5);
}
运行结果:
8
13
13
我们看一下,反编译后的程序,我们发现我们定义的 public event AddEventHandler Add; 反编译后却成了私有的。
其实在类的内部,不管你声明它是public还是protected,它总是private的。
到此,我们用事件也完成了委托一节所完成的功能。事件和委托是如此的相似,到底是什么关系呢?
我们看看事件做了什么事件,其实其作用相当于充当了封装了委托实例而已。事件就是封装了委托实例的委托。另外,委托可以第一次绑定方法时用=,下来可以用=及+=,而事件必须用+=绑定执行的处理程序。
以上是我的个人理解,如有不对,欢迎指正。