发布(publish)和订阅(subscribe): C#中,对象可以发布一组事件供其他类订阅。当发布类产生事件时,所有订阅类都会得到通知。实现了“发布/订阅”模式,即:定义了一种对象之间一对多的依赖关系,当一个对象发生变化时,所有依赖于它的对象都会得到通知并自动更新。 事件(event)和委托(delegate): C#中的时间是用委托实现的。发布类定义了订阅类必须实现的委托。当事件发生时,订阅类的方法将通过委托来调用。 处理事件的方法为事件处理方法。按习惯,.net framework中的事件处理方法返回值为void,有两个参数。一个是事件的“来源”,也就是发布类。另一个是EventArgs派生而来的对象。EventArgs是所有事件数据的基类,EventArgs派生类包含了事件的所有信息。 推荐阅读的书为《C#程序设计(programming C#)》,由 O`REILLY/中国电力出版社 出版。本文上面的介绍性文字摘抄于此书。 using System;
namespace myevent { /// <summary> /// Class1 的摘要说明。 /// </summary> class Class1 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) {
tem mytem=new tem(); mytem.temp=20; Console.WriteLine(mytem.temp); catchtem ct=new catchtem(); //这里是订阅事件 ct.subtem(mytem); catchtem2 ct2=new catchtem2(); //这里是订阅事件 ct2.subtem2(mytem); try { //触发事件 mytem.temp=130; Console.WriteLine(mytem.temp); } catch(Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("end here"); }
} }
//用来提供该事件的一些有用的信息 public class temEA:EventArgs { private string eamsg="now it is in the temEA"; public string es { get { return eamsg; } } public void showtime() { Console.WriteLine(System.DateTime.Now); }
}
public class tem { //定义委托。两个参数,一个为事件的来源,一个为事件的信息 public delegate void temHeader(object sender,temEA e); //定义事件。 public event temHeader ontemEA; temEA e=new temEA(); private int tempi; public int temp { set { tempi=value; //测试事件的发生 if(tempi>100) { //如果ontemEA有被订阅 if(ontemEA!=null) { //发布事件 ontemEA(this,e); }
} } get { return tempi; } }
} public class catchtem { public void subtem(tem tems) { //订阅事件 tems.ontemEA+=new myevent.tem.temHeader(tems_ontemEA); }
//事件处理方法 private void tems_ontemEA(object sender, temEA e) { Console.WriteLine("the tem is too high!"); Console.WriteLine(e.es); } }
public class catchtem2 { public void subtem2(tem tems) { tems.ontemEA+=new myevent.tem.temHeader(tems_ontemEA); }
private void tems_ontemEA(object sender, temEA e) { Console.WriteLine("you'd better down the tem!"); e.showtime(); } } }
|