C#基礎加強篇—委託、Lambda運算式和事件(下)

來源:互聯網
上載者:User

標籤:

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運算式和事件(下)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.