事件是C#中另一高級概念,使用方法和委托相關。奧運會參加百米的田徑運動員聽到槍聲,比賽立即進行。其中槍聲是事件,而運動員比賽就是這個事件發生后的動作。不參加該項比賽的人對槍聲沒有反應。
從程序員的角度分析,當裁判員槍聲響起,發生了一個事件,裁判員通知該事件發生,參加比賽的運動員仔細聽槍聲是否發生。運動員是該事件的訂閱者,沒有參賽的人不會注意,即沒有訂閱該事件。
C#中使用事件需要的步驟:
1、創建一個委托;
2、將創建的委托與特定事件關聯(.Net類庫中的很多事件都是已經定制好的,所以他們也就有相應的一個委托,在編寫關聯C#事件處理程序--也就是當有事件發生時我們要執行的方法的時候我們需要和這個委托有相同的簽名);
3、編寫C#事件處理程序;
4、利用編寫的C#事件處理程序生成一個委托實例;
5、把這個委托實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件。
一、定義事件
定義事件時,發生者首先要定義委托,然后根據委托定義事件。定義事件的語法如下:
<訪問修飾符> event 委托名 事件名;
定義事件時,一定要有一個委托類型,用這個委托類型來定義處理事件的方法類型。下面定義一個發布者類,並在其內部定義eventRun事件。
1 class Judgment 2 { 3 //定義一個委托 4 public delegate void delegateRun(); 5 //定義一個事件 6 public event delegateRun eventRun; 7 }
二、訂閱事件
定義好事件后,與事件有關的人會訂閱事件,只有訂閱事件的對象才會收到發生事件的通知,沒有訂閱該事件的對象則不會收到通知。訂閱事件的語法如下:
事件名+=new 委托名(方法名);
假如方法名為Run,那么訂閱事件eventRun的代碼如下:
judgment.eventRun+=new Judgment.delegateRun(runsport.Run);
judgment為類Judgment的對象,runsport為運動員類RunSports的對象,Run為其中的方法。
事件的訂閱通過“+=”操作符來實現,可以給事件加一個或多個方法委托。
三、引發事件
一般都是在滿足某個條件下引發事件,裁判員槍聲一響,引發運動員奔跑這個事件。在編程中可以用條件詰句,也可以使用方法引發事件。
public void Begin() { enentRun(); }
這段代碼中,通過Begin方法引發事件enentRun。引發事件的語法與調用方法的語法相同,引發該事件時,將調用訂閱事件的對象的所有委托。下面代碼演示裁判員槍聲響起到引發運動員比賽的動作,完整代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Example_EventTest 7 { 8 class Judgment 9 { 10 //定義一個委托 11 public delegate void delegateRun(); 12 //定義一個事件 13 public event delegateRun eventRun; 14 //引發事件的方法 15 public void Begin() 16 { 17 eventRun();//被引發的事件 18 } 19 } 20 class RunSports 21 { 22 //定義事件處理方法 23 public void Run() 24 { 25 Console.WriteLine("運動員開始比賽"); 26 } 27 } 28 class Program 29 { 30 static void Main(string[] args) 31 { 32 RunSports runsport = new RunSports();//實例化事件發布者 33 Judgment judgment = new Judgment();//實例化事件訂閱者 34 //訂閱事件 35 judgment.eventRun+=new Judgment.delegateRun(runsport.Run); 36 //引發事件 37 judgment.Begin(); 38 Console.ReadKey(); 39 } 40 } 41 }
Judgment類為事件發布者,RunSports類為事件訂閱者。引發事件的方法為Begin();。一個事件可以有多個訂閱者,事件的發布者也可以是事件的訂閱者。