NET Framework 类库中的所有事件均基于 EventHandler 委托,定义如下:
//sender:事件源,EventArgs:包含事件数据的类的基类
public delegate void EventHandler(object sender, EventArgs e);
NET Framework 2.0 引入了此委托的一个泛型版本
[SerializableAttribute]
public delegate void EventHandler<TEventArgs>(
Object sender,
TEventArgs e
)
where TEventArgs : EventArgs //泛型必须继承于EventArgs
下面基于代码解释,.NET Framework 下的事件发布,订阅模式
- namespace DotNetEvents
- {
- using System;
- using System.Collections.Generic;
- // 定义一个用户自定义事件类
- public class CustomEventArgs : EventArgs
- {
- public CustomEventArgs(string s)
- {
- message = s;
- }
- private string message;
- public string Message
- {
- get { return message; }
- set { message = value; }
- }
- }
- // Publisher理解为出版社
- class Publisher
- {
- // 申明RaiseCustomEvent,可以理解为发行RaiseCustomEvent刊物,该刊只登载用户自定义事件CustomEventArgs
- // 申明他是事件类(事件可以理解为广播型委托)
- public event EventHandler<CustomEventArgs> RaiseCustomEvent;
- public void DoSomething()
- {
- // 触发一个用户自定义事件。消息为Did something
- OnRaiseCustomEvent(new CustomEventArgs("Did something"));
- }
- // 用户自定义事件的登载操作
- protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
- {
- //这里是把事件的引用传给handler。而事件是多个订阅者处理函数的引用,好拗口。。
- //也可以不用handler,直接用RaiseCustomEvent。
- EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
- // 如果该刊没有订阅者,什么都不做
- // 判断该事件有没有实例化
- if (handler != null)
- {
- // 给事件消息尾加上时间
- e.Message += String.Format(" at {0}", DateTime.Now.ToString());
- // 登载该事件
- handler(this, e);
- }
- }
- }
- //subscriber理解为订阅者
- class Subscriber
- {
- private string id;
- public Subscriber(string ID, Publisher pub)
- {
- id = ID;
- // 增加该刊物的订阅者(处理函数)
- // 为什么用[+=],事件特殊于委托,可以加载多个函数。这里类似于委托的实例化
- pub.RaiseCustomEvent += HandleCustomEvent;
- }
- // 订阅者(处理函数)看到事件后的反应
- void HandleCustomEvent(object sender, CustomEventArgs e)
- {
- Console.WriteLine(id + " received this message: {0}", e.Message);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Publisher pub = new Publisher();
- Subscriber sub1 = new Subscriber("sub1", pub);
- Subscriber sub2 = new Subscriber("sub2", pub);
- // Call the method that raises the event.
- pub.DoSomething();
- // Keep the console window open
- Console.WriteLine("Press Enter to close this window.");
- Console.ReadLine();
- }
- }
- }
- 以上内容转自http://blog.csdn.net/chagaostu/article/details/6298593