API-1_2事件
事 件
一、 事件概述
物件之間的互動通過訊息傳遞來實現,事件就是物件傳送的訊息,用來發訊號通知操作的發生。引發(觸發)事件的物件叫做事件釋出方;捕獲事件並做出相應響應的物件叫做事件訂閱方。因此事件使用釋出-訂閱(publisher-subscriber) 模型。
在事件通訊中,不知道哪個物件或方法將接受處理它所引發的事件,因此需要在釋出方和訂閱方用一個紐帶聯絡.C#中使用委託作這個紐帶。
事件主要由委託、事件源和事件訂購者組成。
程式設計時事件在類中宣告且生成,且通過使用同一個類或其他類中的委託與事件處理程式關聯。包含事件的類用於釋出事件。這被稱為釋出器(publisher) 類。其他接受該事件的類被稱為訂閱器(subscriber) 類。
釋出器(publisher) 是一個包含事件和委託定義的物件。事件和委託之間的聯絡也定義在這個物件中。釋出器(publisher)類的物件呼叫這個事件,並通知其他的物件。
訂閱器(subscriber) 是一個接受事件並提供事件處理程式的物件。在釋出器(publisher)類中的委託呼叫訂閱器(subscriber)類中的方法(事件處理程式)。事件處理程式本身都是簡單的方法。對事件處理方法的唯一限制是它必須匹配於事件所要求的返回型別和引數。這種限制是事件定義的一部分,由一個委託指定。
二、使用事件,步驟如下
- 宣告委託:
在定義自己的事件之前需要有一個委託型別,事件本質上是委託型別的一個特殊例項,所以,離開委託而單獨定義的事件在C#中是不存在的。委託可以限制能夠訂閱該事件的方法的返回型別和引數。
例:public delegate void MessageHandler(string messageText);
- 定義委託型別的事件
在C#中event關鍵字定義事件,這個關鍵字允許你指定一個委託型別的事件,當事件觸發時就執行委託中註冊的一個或多個方法。在類中定義事件,包含事件的類用於釋出事件,這被稱為釋出器(publisher) 類。語法如下:
【訪問修飾符】 event 委託型別 事件名;
例:public event MessageHandler MessageArrive;
語法說明如下。
(1) 事件由釋出器(publisher)物件定義,因此事件定義在某個類的內部。
(2) 定義事件需要使用event關鍵字。
(3) 定義事件需要指明事件的委託型別,用以限制能夠訂閱該事件的方法的返回型別和引數
- 定義方法引發事件
在釋出器類中定義引發事件的方法
例:public void CheckForMessage(string message)
{
Console.WriteLine("檢測連線");
//檢測隨機數是否等於0且事件是否被訂閱
if (r.Next(0, 10) == 0 && MessageArrive != null)
{
//引發事件,並將引數進行傳遞
MessageArrive(message);
}
else
{
//重新呼叫自己實現迴圈遞迴
CheckForMessage(message);
}
}
- 定義方法訂閱事件
接受事件的類被稱為訂閱器(subscriber) 類,在此類中接受事件並提供事件處理程式——訂閱方法
例:public void ShowMessage(string message)
{
Console.WriteLine("我接收到了連線者的資訊:{0}", message);
}
- 將訂閱方法註冊到事件
在另一個類或釋出器中為事件註冊方法
Connection con = new Connection();
Display dis = new Display();
//為con物件的MessageArrive事件註冊dis物件的ShowMessage方法
con.MessageArrive += dis.ShowMessage;
- 觸發事件
//觸發con物件的MessageArrive事件並傳遞資訊
con.CheckForMessage("hello");