事件是C#中另外一高級概念,使用方法和委託相關。奧運會參加百米的田徑運動員聽到槍聲,比賽當即進行。其中槍聲是事件,而運動員比賽就是這個事件發生後的動做。不參加該項比賽的人對槍聲沒有反應。程序員
從程序員的角度分析,當裁判員槍聲響起,發生了一個事件,裁判員通知該事件發生,參加比賽的運動員仔細聽槍聲是否發生。運動員是該事件的訂閱者,沒有參賽的人不會注意,即沒有訂閱該事件。編程
C#中使用事件須要的步驟:
一、建立一個委託;
二、將建立的委託與特定事件關聯(.Net類庫中的不少事件都是已經定製好的,因此他們也就有相應的一個委託,在編寫關聯C#事件處理程序--也就是當有事件發生時咱們要執行的方法的時候咱們須要和這個委託有相同的簽名);
三、編寫C#事件處理程序;
四、利用編寫的C#事件處理程序生成一個委託實例;
五、把這個委託實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件。
1、定義事件post
定義事件時,發生者首先要定義委託,而後根據委託定義事件。定義事件的語法以下:spa
<訪問修飾符> event 委託名 事件名;code
定義事件時,必定要有一個委託類型,用這個委託類型來定義處理事件的方法類型。下面定義一個發佈者類,並在其內部定義eventRun事件。對象
1 class Judgment 2 { 3 //定義一個委託 4 public delegate void delegateRun(); 5 //定義一個事件 6 public event delegateRun eventRun; 7 }
2、訂閱事件blog
定義好事件後,與事件有關的人會訂閱事件,只有訂閱事件的對象纔會收到發生事件的通知,沒有訂閱該事件的對象則不會收到通知。訂閱事件的語法以下:事件
事件名+=new 委託名(方法名);ci
假如方法名爲Run,那麼訂閱事件eventRun的代碼以下:string
judgment.eventRun+=new Judgment.delegateRun(runsport.Run);
judgment爲類Judgment的對象,runsport爲運動員類RunSports的對象,Run爲其中的方法。
事件的訂閱經過「+=」操做符來實現,能夠給事件加一個或多個方法委託。
3、引起事件
通常都是在知足某個條件下引起事件,裁判員槍聲一響,引起運動員奔跑這個事件。在編程中能夠用條件詰句,也可使用方法引起事件。
1
2
3
4
|
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();。一個事件能夠有多個訂閱者,事件的發佈者也能夠是事件的訂閱者。