程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎加強篇—委托、Lambda表達式和事件(下),

C#基礎加強篇—委托、Lambda表達式和事件(下),

編輯:C#入門知識

C#基礎加強篇—委托、Lambda表達式和事件(下),


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 GetStrText
10         {
11             get
12             {
13                 return StrText;
14             }
15         }
16     }
17 
18     public class EventSource
19     {//發布事件的類
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 Test
33     {//訂閱事件的類
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表達式、事件的一些基礎知識完。。。。

 這是我第一次寫博客,本人也還是在大學裡摸索的渣渣,幾乎都是書上的一些內容,感覺自己一個字一個字打出來印象會比較深刻,理解也更到位,大神勿噴。。。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved