事件為類和類的實例提供了向外界發送通知的能力,實現了對象與對象之間的通信,如果定義了一個事件成員,表示該類型具有 1.能夠在事件中注冊方法 (+=操作符實現)。 2.能夠在事件中注銷方法(-=操作符實現)。 3.當事件被觸發時注冊的方法會被通知(事件內部維護了一個注冊方法列表)。委托(Delegate)是事件(event)的載體,要定義事件就的要有委托。 有關委托的內容請點擊 委托(Delegate) 進入了解。
在類的內部聲明事件,首先必須聲明該事件的委托類型。例如:
pulic delegate void MyDelegateHandler(object sender,EventArgs e);
然後基於上面的例子,再聲明事件,使用關鍵字 event
pulic event MyDelegateHandler MyEvent;
(object類型是所有類的基類,有關他的詳情前面已經說過了點擊 object類型 進入了解,EventArgs 是包含事件數據的類的基類,用於傳遞事件的細節。)
每周的星期六我有一個雷打不動的習慣,喜歡去學校外面的一個超市買東西,那家超市有一個自動門,就是當我們走近一定距離(3米)的時候會自動打開,還會十分溫柔與親切的說“歡迎光臨”,因為我經常去他家買東西,辦理了會員,所以每當我走近的時候自動門好像認識我,非常熱情的說“熱烈歡迎HC666光臨本超市^_^”這個門倒是挺好玩那
上面的例子中將“自動門”看作一個由Door實例化的對象,“我”是一個由person實例化的對象,當我調用“去超市”的動作,並且距離超市門口3米的時候,觸發我們定義的“Enterdoor”事件,然而Enterdoor裡面使用委托注冊了一個“自動門(door)”的“開門(Opendoor)”動作,相當於調用了開門方法,這樣就達到了對象與對象之間的通信與交流,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { //定義一個person類,裡面包含了方法 class person { public string name = HC666; private int distance; //聲明委托 public delegate void EnterdoorHandler(object sender,EnterdoorArgs e); //基於委托聲明事件 public event EnterdoorHandler Enterdoor; //定義的一個去超市的方法,當距離 distance<=3的時候觸發事件 public void GotoStore() { for (int i = 6; i > 0; i--) { distance = i; if (i <= 3) {//觸發事件了 EnterdoorArgs e = new EnterdoorArgs(distance); OnEnterdoor(e);//調用觸發事件方法 } } } public void OnEnterdoor(EnterdoorArgs e) {//調用事件裡注冊的方法 if (Enterdoor != null) Enterdoor(this, e); else Console.WriteLine(沒有添加處理方法); } //定義一個包含事件數據的類,這裡distance是一個判斷的重要數據 public class EnterdoorArgs:EventArgs { public int distance; public EnterdoorArgs(int distance) { this.distance = distance; } } } //定義門這個類 class Door {//定義開門的方法 public void Opendoor(object sender, person.EnterdoorArgs e) { person per = (person)sender; //有點熟悉吧,顯示類型轉換中有談到 if (e.distance == 3) { Console.WriteLine(尊敬的顧客您距離本超市 {0}米 即將開門迎接您, e.distance); } if(e.distance <3) Console.WriteLine(熱烈歡迎 {0} 光臨本超市, per.name); } } class program { static void Main(string[] args) { person per = new person(); //實例化對象 Door door = new Door(); //向事件中注冊開門的方法 per.Enterdoor += door.Opendoor; //我去超市 per.GotoStore(); } } }
結果: