.NET中的高级特性之“事件”
1 事件概述
事件
是一种使对象或类能够提供通知的成员。
客户端可以通过提供“事件处理程序”为相应的“事件”添加可执行代码
设计和使用事件的全过程
(1). 如果需要的话,定义一个派生自System.EventArgs的参数类型
(即创建EventArgs类,以保存信息)
(2). 在事件的管理类中定义“事件”
(3). 通知事件订阅者(事件发送方法)
(4). 事件使用客户端订阅/取消事件
2 示例
创建EventArgs类
///<summary> ///自定义一个事件参数类 ///</summary> public class AbcEventArgs : EventArgs { ///存放消息 private string _message; public string Message { get { return _message; } } #region 构造函数 public AbcEventArgs() : base() { _message = string.Empty; } public AbcEventArgs(string message) : base() { _message = message; } #endregion 构造函数 }
创建事件管理类
//声明委托类 同时在C#中也存在”预定义委托” 如“EventHandler<TEventArgs>”可直接使用 public delegate void ChangedEvent(object sender, AbcEventArgs e); public class AbcEventManager { //声明一个“事件”Changed代表事件本身,同时也是“委托类”引用变量因此可代表编制的"事件处理函数"public event ChangedEvent Changed; //控制台输出 public void Output(String message) { //使用已定义的参数类 AbcEventArgs args = new AbcEventArgs(message); //在Output中控制台输出,引发另一个输出,接着调用“事件发送方法” Console.WriteLine(message);
onChanged(args); } //事件发送方法,通知所有注册者。 protected virtual void onChanged(AbcEventArgs e) { //如果Changed代表“事件处理函数”,在此作个检查 if(Changed != null) //执行了Changed代表的函数 Changed(this, e); } }
成员Changed将“事件”和“事件处理程序”联系起来了。注意OnChanged方法
事件的预定和取消
public class Test { //事件处理函数 static void Abc_Changed(object sender, AbcEventArgs e) { Console.WriteLine("同时引发了这个输出"); } public void Process() { AbcEventManager aem = new AbcEventManager(); //事件的预定 aem.Changed+=new ChangedEvent(Test.Abc_Changed); //预定后则执行触发事件 aem.Output("第一此输出"); //事件的撤销 aem.Changed -= new ChangedEvent(Test.Abc_Changed); //撤销后事件不触发事件 aem.Output("第二次输出"); } }
执行
static void Main() { Test test = new Test(); test.aaaaa(); }
在控制台程序中program类加入以上三个类,Main()函数换成上图
结果
事件实际上实现了”observers模式”
3 总结
事件是一种使对象或类能够提供通知的成员。客户端通过提供“事件处理程序”为相应的事件添加“可执行代码”。
事件是一种特殊的委托。例如 EventHandler<ConsoleEventArgs>这个类型是一个“泛型委托类型”,它没有返回值,但有两个参数: object sender 和 EventArgs e。当事件使用者订阅事件时,本质是把"事件处理方法"加入到委托链表中。