event 事件

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(); } } }

你可能感兴趣的:(.net,String,object,System,Class,出版)