事件為類和類的實例提供了向外界發送通知的能力,實現了對象與對象之間的通信,如果定義了一個事件成員,表示該類型具有 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();
}
}
}
結果:
