c#中事件從本質上說,應該是一個限制了的委託,下面的範例程式碼應該可以很好的說明這一點:
這樣做的好處是可以隨時改變事件發生時的響應函數而不必修改事件類別的任何代碼,事件發生時執行的函數在運行時才進行綁定。
class Program
{
static void Main(string[] args)
{
AlertEq ae = new AlertEq();
//事件響應函數綁定
ae.Action += new AlertEq.ActionEventHandler(EventHander.process);
//發生事件
ae.action("sichuan", 6);
ae.action("sichuan", 5);
ae.action("sichuan", 3);
}
}
//地震事件類別,action是發生事件的函數
class AlertEq
{
//定義委託
public delegate void ActionEventHandler(object o, EarthquackArgs e);
//申明事件
public event ActionEventHandler Action;
//事件發生
public void action(string area, int rank)
{
EarthquackArgs arg = new EarthquackArgs(area, rank);
Action(this, arg);
}
}
//地震事件的捕獲類,負責真正事件的處理
static class EventHander
{
public static void process(object sender, EarthquackArgs message)
{
Console.WriteLine(sender.ToString() + " make the alert;");
Console.WriteLine("we have a " + message.rank + " rank earthquack " + " in " + message.area + " province!");
}
}
//事件參數類
public class EarthquackArgs : EventArgs
{
public string area;
public int rank;
public EarthquackArgs(string area, int rank)
: base()
{
this.area = area;
this.rank = rank;
}
}