可以看出,C#中的event是通过delegate实现的,event 只是在delegate基础上作了两点限制:
1:客户只能使用委托所提供的+=和-=行为,不能直接用=,即不影响委托对其他observer的notify.
2:只有声明类可以调用(或激发)一个事件,外部类不可以直接调用其事件。
在一个C#接口中可以包容方法、C#属性以及索引器,也可以包容事件,但不能包含委托,因为接口定义的是成员,委托定义的是一个类型,而事件同样是成员。
using System;

namespace EventKeyWord


{

/**//// <summary>
/// Summary description for Class1.
/// </summary>
class test

{

/**//// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)

{
//
// TODO: Add code to start application here
//
Clock clk=new Clock();
DisplayClock dc=new DisplayClock();
dc.subscribe(clk);
logClock mlogClock=new logClock();
mlogClock.subscribe(clk);
clk.run();
//if no event in line 45,the OnSecondChange could be invoked directly here
}
}
public class TimeInfoEventArgs:EventArgs

{
public readonly int hour;
public readonly int minute;
public readonly int second;
public TimeInfoEventArgs(int hour,int minute,int second)

{
this.hour=hour;
this.minute=minute;
this.second=second;
}
}
public class Clock

{
public delegate void SecondChange(object Clock,TimeInfoEventArgs args);
private int hour;
private int minute;
private int second;
public event SecondChange OnSecondChange;//the keyword event is optional
public Clock()

{
hour=System.DateTime.Now.Hour;
minute=System.DateTime.Now.Minute;
second=System.DateTime.Now.Second;
}
public void run()

{
while(1==1)

{
System.Threading.Thread.Sleep(10);
DateTime dt=System.DateTime.Now;
if(dt.Second!=second)
if(OnSecondChange!=null)

{
OnSecondChange(this,new TimeInfoEventArgs(hour,minute,dt.Second));
}
hour=System.DateTime.Now.Hour;
minute=System.DateTime.Now.Minute;
second=System.DateTime.Now.Second;

}
}
}
//a class to display the current clock
public class DisplayClock

{
public void subscribe(Clock clk)

{
clk.OnSecondChange+=new Clock.SecondChange(this.displayClock);
}
public void displayClock(object Clock,TimeInfoEventArgs args)

{
Console.WriteLine("displayClock now:");
Console.WriteLine(args.hour+":"+args.minute+":"+args.second);
}
}
//a second class to log the current clock
public class logClock

{
public void subscribe(Clock clk)

{
clk.OnSecondChange+=new Clock.SecondChange(this.logsClock);
//if no event in line 45,this could be clk.OnSecondChange+=new Clock.SecondChange(this.logsClock); and the displayClock won't work
}
public void logsClock(object Clock,TimeInfoEventArgs args)

{
Console.WriteLine("logClock now:");
Console.WriteLine(args.hour+":"+args.minute+":"+args.second);
}
}
}
