一 發布者和訂閱者
很多時候都有這種需求,當一個特定的程式事件發生時,程式的其他部分可以得到該事件已經發生的通知,
發布者/訂閱者模式可以滿足這種需求,

發布者:發布某個事件的類或結構,其他類可以在該事件發生時得到通知,
訂閱者:注冊并在事件發生時得到通知的類或結構,
事件處理程式:由訂閱者注冊到事件的方法,在發布者觸發事件時執行,
觸發事件:當事件觸發時,所有注冊到它的方法會被依次呼叫,
事件包含了一個私有的委托,事件提供了其私有的委托的結構化訪問,
二 事件的使用
2.1 宣告事件
class Incrementer { //宣告一個CoutedADozen事件 public event EventHandler CountedADozen; }
事件宣告在一個類中,通過event關鍵字宣告,
需要委托型別的名稱(如:EventHandler),任何注冊到事件的處理程式都必須與委托相匹配,
事件是成員,事件成員被隱式自動初始為null,
BCL宣告了一個叫做EventHandler的委托,專門用于系統事件,
2.2 訂閱事件
訂閱者向事件添加事件處理程式,對于一個要添加到事件的處理程式來說,它必須具有與事件的委托相同的回傳型別和簽名,
訂閱事件的幾種形式:
//訂閱事件的幾種形式 incrementer.CountedADozen += IncrementDozensCount; //方法參考形式,實體方法 incrementer.CountedADozen += ClassB.CountHandlerB; //方法參考形式,靜態方法 incrementer.CountedADozen += new EventHandler(cc.CountHandleC); //委托形式
和委托一樣,也可以使用匿名方法和Lambda運算式來添加事件處理程式,
2.3 觸發事件
下附簡單的包含發布者和訂閱者程式,
delegate void Handler(); //宣告委托 class Incrementer { public event Handler CountedADozen; //宣告事件并發布 public void DoCount() { for (int i = 0; i < 100; i++) { if (i % 10 == 0) { if (CountedADozen != null) { CountedADozen(); //先判斷事件是否為null,再觸發事件 } // 簡化事件觸發語法: CountedADozen?.Invoke(); } } } } class Dozens { public int DozensCount { get; private set; } public Dozens(Incrementer incrementer) { incrementer.CountedADozen += IncrementDozensCount; //訂閱事件 } //事件處理程式 private void IncrementDozensCount() { DozensCount++; } } class Program { static void Main(string[] args) { var incrementer = new Incrementer(); var dozens = new Dozens(incrementer); incrementer.DoCount(); Console.WriteLine($"Number of dozens = {dozens.DozensCount}"); Console.Read(); } }
2.4 移除事件處理程式
incrementer.CountedADozen -= IncrementDozensCount; //移除事件處理程式
如果一個處理程式向事件注冊了多次,那么當執行命令移除處理程式時,將只移除串列中該處理程式的最后一個實體,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445841.html
標籤:.NET技术
上一篇:關于.Net Core下因客戶端主動取消導致Request請求[FromBody]模型系結讀取例外BadHttpRequestException
