標籤:
3.事件
事件作為C#中的一種類型,為類和類的執行個體定義發出通知的能力,從而將事件和可執行代碼捆綁在了一起。事件是對象發送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動引起的,也可能是由某些其他的程式邏輯觸發的。引發(觸發)事件的對象叫做事件發送方,捕獲事件並對其做出響應的對象叫做事件接收方。
C#事件是按“發布——預定”的方式工作。先在一個類中公布事件,然後就可以在任意數量的類中對事件預定。在事件通訊中,事件發送方類並不知道哪個對象或方法將接收到(處理)它所引發的事件。所需要的是在源和接收方之間存在一個媒介(或類似指標的機制),這一媒介就是委託。
事件功能是由3個互相聯絡的元素提供:提供事件數目據的類、事件委託和引發事件的類。如果想要類引發名為EventName的事件,需要以下元素:
(1)持有事件數目據的類:名為EventNameEventArgs。該類必須繼承System.EventArgs類。如果不自訂持有事件數目據的類,就使用System.EventArgs類。
(2)事件的委託:名為EventNameEventHandler
(3)引發該事件的類。該類必須提供:
a.事件聲明:public event EventNameEventHandler EventName;
b.引發事件的方法:名為OnEventName
(4)定義使用此事件的類。所有這些類都應該包括:
建立事件來源對象。使用定義的建構函式建立包含事件定義的類的對象。
定義事件處理常式,也就是定義與事件關聯的方法。
將事件來源對象註冊到事件處理處理常式。使用委派物件和“+=”運算子和“-=”運算子將一個或多個方法與事件來源中的事件關聯。
C#事件機制基於委託實現,首先要定義一個委託:
public delegate void EventHandler(object from,myEventArgs e); //from表示發生事件的對象
聲明事件的格式:event 事件的委託名 事件名
public event EventHandler TextOut;
事件的啟用一般寫成:
if(TextOut!=null)
TextOut(this,new EventArgs());
訂閱事件 += evsrc.TextOut+=new EventSource.EventHandler(CatchEvent);
取消訂閱 -= evsrc.TextOut-=new EventSource.EventHandler(CatchEvent);
下面再來看一個樣本:
1 public class MyEventArgs:EventArgs 2 { //定義事件包含資料 3 4 private string StrText; 5 public MyEventArgs(string StrText) 6 { 7 this.StrText = StrText; 8 } 9 public string GetStrText10 {11 get12 {13 return StrText;14 }15 }16 }17 18 public class EventSource19 {//發布事件的類20 21 MyEventArgs EvArgs = new MyEventArgs("觸發事件");22 public delegate void EventHandler(object from, MyEventArgs e);//定義委託23 public event EventHandler TextOut;//定義事件24 public void TriggerEvent()//啟用事件的方法25 {26 if(TextOut!=null)27 {28 TextOut(this, EvArgs);29 }30 }31 } 32 class Test33 {//訂閱事件的類34 static void Main(string[] args)35 {36 EventSource evsrc = new EventSource();37 evsrc.TextOut += new EventSource.EventHandler(CatchEvent);//訂閱事件38 evsrc.TriggerEvent();//觸發事件39 Console.WriteLine("--------------");40 41 evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);//取消訂閱事件42 evsrc.TriggerEvent();//由於訂閱已取消,什麼也不執行43 Console.WriteLine("--------------");44 45 Test theApp=new Test();46 evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch);47 evsrc.TriggerEvent();48 }49 private static void CatchEvent(object from, MyEventArgs e)50 {//事件處理常式51 Console.WriteLine("CatchEvent:{0}", e.GetStrText);52 } 53 private void InstanceCatch(object from, MyEventArgs e)54 {//事件處理常式55 Console.WriteLine("InstanceCatch:{0}", e.GetStrText);56 }57 }
可以對照著上面的介紹,來找一下事件的幾個相關元素。
委託、Lamada運算式、事件的一些基礎知識完。。。。
這是我第一次寫部落格,本人也還是在大學裡摸索的渣渣,幾乎都是書上的一些內容,感覺自己一個字一個字打出來印象會比較深刻,理解也更到位,大神勿噴。。。
C#基礎加強篇—委託、Lambda運算式和事件(下)