1.事件
.NET事件就像是具有特殊用途之委派,而且是比較單純之委派。
2.事件驅動程式設計
某物件將本身提供之服務透過方法公開給其他物件呼叫,達成特殊目的。
此過程中有兩種角色:
服務端:提供服務之物件。
用戶端:使用別人的服務。
3.發行-訂閱模式
例如:雜誌社,會在特定時間發行雜誌(事件),而讀者比需先跟雜誌社先訂閱某類行雜誌(訂閱事件),
同時提供收件地址(callback函式的位址),每當雜誌社出版時,雜誌社就會主動將雜誌寄給用戶事先
指定之位址(callback函式之位址)。
如果以上例子還是不懂,那麼可以這麼說, .NET事件處理機制就是一種發行與訂閱的概念。
發佈事件提供外界訂閱之物件稱之為:發行者。
訂閱事件的用戶端稱之為:訂閱者。
note:一個事件可以有多個訂閱者,當某事件發生後,會去通知所有訂閱該事件之訂閱者。
用戶在訂閱事件時必須提供一個函式位址,發行者會將這個位址保留在其物件串列中,
以便事件發生時候去出叫那些函式,這些用來處理特定事件之函式稱之為:
event handler事件處理者(程式碼中訂閱者的TextChangedHandler() and AnotherHandler() )。
4.使用Delegate實做Event
用委派做出事件有下列四步驟:
1.在發行者類別宣告委派類別。
2.在發行者類別宣告委派常數。
3.訂閱者使用+=運算子來訂閱事件(將事件處理函式位址存入委派物件的呼叫清單中)。
4.觸發事件(可以由發行者物件所引發或外界所引發)。
5.Example
功能:設計一個物件,此物件上有text屬性,當這個text屬性被修改時候,可以觸發事件。
發行者物件:MyPublisher
訂閱者物件:MySubscriber
事件名稱:TextChanged
事件觸發後處理之事件處理常式:TextChangedEventHandler
以下開始實做"發行者":
Step1: 事件概念對應到程式實做,就是一個委派物件而此物件內部將會儲存所有外界訂閱此事件時,所提供之事件處理常式之位址。
由與此事件代表:Text屬性改變了,故將此事件處理常式的委派名稱取為:TextChangedEventHandler。
public delegate void TextChangedEventHandler(string oldValue , string newValue);
注意這行程式碼是在宣告一個委派型別,包含一個delegate關鍵字宣告為委派型別,一個函式簽名檔(TextChangedEventHandler),傳回植void,以及傳入參數。
Step2:宣告委派變數
定義好是件處理常式該長什麼樣子之後,接著要有一個變數用來儲存外界訂閱事件時提供之事件處理常式的函式位址。
訂閱者眾,所以此變數必須能存放多個函式位址。
上個步驟宣告之委派型別建立之物件實體,改物件實體內部有一個用來儲存事件處理常式之串列,通常將此串列稱為呼叫清單(invocation list)。
此行利用Step1之TextChangedHandler(委派型別)來宣告一個公開成員:TextChanged。
將來外界訂閱事件時所提供的函式位址,就會儲存在此變數所關聯之物件實體中。
public class MyPublisher
{
public TextChangedHandler TextChanged;
}
Step3:觸發事件
在何處觸發事件事最佳的? 就是在改變Text屬性之源頭來觸發事件,肯定不會有遺漏。
因此我在Text屬性的setter加上觸發事件。
發行者部分到此結束。
"訂閱者"部分實做:
主程式:
完整程式碼:
https://drive.google.com/open?id=0B7xmgb1TKMCTflVlNnpmbUxoUDJFeX
E1T0U0N2tSdzg5MUdNQlA2ZGdTOHc2aktBdzFEX1E&authuser=0