2004-6-28 + C#中的事件机制
发布(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();
}
}
}