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