《C#進階編程》之事件學習筆記

來源:互聯網
上載者:User

    引用《C#進階編程(第六版)》:

      基於Windows的程式也是基於訊息的。這說明應用程式是通過Windows來通訊的,Windows又是使用預定義的訊息與應用程式通訊的。這些訊息是包含各種資訊的結構,應用程式和Windows使用這些資訊決定下一步的操作。在MFC等庫或Visual Basic等開發環境推出之前,開發人員必須處理Windows發送給應用程式的訊息。Visual Basic和今天的.NET把這些傳送來的訊息封裝在事件中。如果需要響應某個訊息,就應處理對應的事件。一個常見的例子是使用者單擊了表單中的按鈕後,Windows就會給按鈕訊息處理常式(有時稱為Windows過程或WndProc)發送一個WM_MOUSECLICK訊息。對於.NET開發人員來說,這就是按鈕的Click事件。

  在開發基於對象的應用程式時,需要使用另一種對象通訊方式。在一個對象中發生了有趣的事情時,就需要通知其他對象發生了什麼變化。這裡又要用到事件。就像.NET Framework把Windows訊息封裝在事件中那樣,也可以把事件用作對象間的通訊介質。

  委託就用作應用程式接收到訊息時封裝事件的方式。

  

  因此理解事件就得先瞭解這兩個概念,它們是事件編程的基本部分:事件發生器(發生事件的類)和事件處理器(處理事件的類)。

  事件發生器,指的是引發了某些事件的類、應用程式或組件。

  事件接收器,指的是發生某些事件時被通知的任何應用程式、對象或組件,用於響應並處理髮生器引發的事件。

  事件發生器不知道接收器會處理其發生的事件,而接收器在某個地方需要有個方法來負責處理事件。在每個發生登入的事件時,就執行這個事件處理常式。因此就需要引入委託來實現這個功能,即讓委託充當事件發生器和事件接收器之間的媒介。

  使用事件需要如下步驟:

  1)建立事件類別

    2)建立事件發生器和一個委託

  3)將建立的委託與特定事件類別關聯

  4)編寫事件接收器和事件處理常式

  5)利用編寫的事件處理常式產生一個委託執行個體

  6)把這個委託執行個體添加到產生事件對象的事件列表中去,這個過程叫事件訂閱

  (參考:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html)

  詳細代碼如下:  

      1、建立事件類別,注意EventArgs是包含事件類別的基類,此類不包含事件數目據,在事件引發時不向事件處理常式傳遞事件的狀態資訊可以使用這個類,如果事件類別需要使用狀態資訊,則應用程式需從此類派生一個類來儲存狀態資訊。這裡的事件類別有兩個資訊EventCode和EventValue,因此需要派生出ActionEventArgs類。

 1 public class ActionEventArgs:EventArgs
2 {
3 private string eventCode;
4 private string eventValue;
5
6 public ActionEventArgs(string _eventCode,string _eventValue)
7 {
8 this.eventCode=_eventCode;
9 this.eventValue=_eventValue;
10 }
11
12 public string EventCode
13 {
14 get
15 {
16 return this.eventCode;
17 }
18 set
19 {
20 this.eventCode=value;
21 }
22 }
23
24 public string EventVaue
25 {
26 get
27 {
28 return this.eventValue;
29 }
30 set
31 {
32 this.eventValue=value;
33 }
34 }
35 }

 

  2、建立事件發生器和一個委託,並將委託與特定事件關聯

 1 public class EventActor 
2 {
3 //建立一個委託
4   public delegate void ActionEventHandle(object sender,ActionEventArgs e);
5 //將建立的委託和特定事件關聯
6   public event ActionEventHandle Actor;
7
8 public void Excute()
9 {
10 string code=Console.ReadLine();
11 string value=Console.ReadLine();
12 ActionEventArgs actionEventArgs=new ActionEventArgs(code,value);
13 Actor(this,actionEventArgs);
14 }
15 }

 上面的Actor(this,actionEventArgs)用於觸發事件,並將事件交由Actor這個委託處理,委託就可指定特定程式處理事件,即由事件接收器處理,this指觸發事件的對象是本身,actionEventArgs包含事件的狀態資訊。

   

  3、編寫事件接收器和事件處理常式,同時產生一個委託執行個體並進行事件訂閱

       這個類產生一個委託執行個體,再把這個委託執行個體添加到事件發生器的事件列表裡去,這就是事件訂閱。 

 1 public class EventReceiver
2 {
3 public EventReceiver(EventActor actEvent)
4 {
5 actEvent.Actor+=new EventActor.ActionEventHandle(this.EventResponse);
6 }
7
8 private void EventResponse(object sender,ActionEventArgs e)
9 {
10 Console.WriteLine("EventCode:{0},EventValue:{1}",e.EventCode,e.EventValue);
11 }
12 }

 

  4、程式入口

1 public class Test
2 {
3 public static void Main()
4 {
5 EventActor actor=new EventActor();
6 EventReceiver receiver=new EventReceiver(actor);
7 actor.Excute();
8 }
9 }

  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.