发布符合 .NET Framework 准则的事件
(1)不生成事件数据。 .NET Framework 类库中的所有事件均基于EventHandler委托。EventHandler是一个预定义委托,当不生成数据随事件一起发送时,该委托无需声明,因为它已在创建 C# 项目时包含的System命名空间中进行了声明。
EventHandler委托定义如下:
//sender 是引发事件的对象 //e 是不包含任何数据的事件数据对象。 public delegate void EventHandler(object sender, EventArgs e);
不生成事件数据直接声明如下:
public event EventHandler RaiseCustomEvent;
(2)生成事件数据,EventHandler委托第二个参数为EventArgs类派生类。
EventArgs派生类定义如下:
//在派生类中自定义保存事件数据所需的全部字段或属性 public class CustomEventArgs : EventArgs { private string message; public string Message { set { message = value; } get { return message; } } public CustomEventArgs(string s) { message = s; } }
然后声明委托,声明事件如下:
public delegate void CustomEventHandler(object sender, CustomEventArgs e); public event CustomEventHandler RaiseCustomEvent;
(3)生成事件数据,也可以使用.NET Framework 2.0 引入EventHandler的一个泛型版本EventHandler<TEventArgs>。使用泛型版本,不需声明委托。直接声明事件如下:
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
(4)msdn符合.NET Framework 准则的事件实例。
//该实例演示符合.net Framework规范的事件 class NetFrameworkEvent { static void Main(string[] args) { Publisher pub = new Publisher(); Subscrier sub1 = new Subscrier("sub1", pub); Subscrier sub2 = new Subscrier("sub2", pub); pub.DoSomething(); Console.Read(); } } public class CustomEventArgs : EventArgs { private string message; public string Message { set { message = value; } get { return message; } } public CustomEventArgs(string s) { message = s; } } //发行者 public class Publisher { /* * 生成事件数据的第一种用法, * 自定义委托第二个参数为EventArgs的派生类。 public delegate void CustomEventHandler(object sender, CustomEventArgs e); public event CustomEventHandler RaiseCustomEvent; */ //生成事件数据的第二种用法, //直接用EventHandler的泛型版本声明事件, //该方法无需声明委托。 public event EventHandler<CustomEventArgs> RaiseCustomEvent; public void DoSomething() { OnRaiseCustomEvent(new CustomEventArgs("Do something")); } protected virtual void OnRaiseCustomEvent(CustomEventArgs e) { //CustomEventHandler handler = RaiseCustomEvent; EventHandler<CustomEventArgs> handler = RaiseCustomEvent; if (handler != null) { e.Message += string.Format(" at {0}", DateTime.Now.ToString()); handler(this, e); } } } //订阅者 public class Subscrier { private string _id; public Subscrier(string id, Publisher pub) { _id = id; pub.RaiseCustomEvent += HandleCustomEvent; } private void HandleCustomEvent(object sender, CustomEventArgs e) { Console.WriteLine("{0} received this message: {1}", _id, e.Message); } }
输出如下: