Software--C#--grammer_Delegate--Event
阿新 • • 發佈:2018-05-01
lar delete mage bbb class 傳輸 tin 運算符 gate
2018-05-01 10:49:47
委托是一種類型,而事件是一個類或結構的成員,如同字段,屬性。必須在類或結構中聲明。
引申 - Observe 觀察者模式 Publish/Subscribe 發布-訂閱模式
一 基本形式
1. 如上圖所示,聲明委托,類中構建 事件 及 觸發代碼
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace EventDemoView Code8 { 9 // Event 1 of 5 elements -- deletegate declare 10 delegate void Handler(); 11 12 // Publisher 13 // 1. Event declare 14 // 2. fire event code 15 class Incrementer 16 { 17 public event Handler eventPub; // create event 18 19 // 觸發事件的代碼20 public void DoIncrement() 21 { 22 for(int i = 0; i < 100; i++) 23 { 24 if (i % 12 == 0 && eventPub != null) 25 eventPub(); 26 } 27 } 28 29 } 30 }
2. 訂閱者中 創建事件處理程序 及 註冊事件。
1 usingView CodeSystem; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace EventDemo 8 { 9 /* 10 * 訂閱者 11 * 1.事件處理程序 12 * 2.構造器中註入 Publisher,構造代碼中給事件添加處理程序方法。訂閱事件。 13 */ 14 class subscribeCode 15 { 16 public int DozoneCount { get; private set; } 17 18 // 事件處理程序 19 void IncrementCount() 20 { 21 DozoneCount++; 22 } 23 24 // 構造器 訂閱事件 25 public subscribeCode(Incrementer inc) 26 { 27 DozoneCount = 0; 28 inc.eventPub += IncrementCount; 29 } 30 31 } 32 }
二 EventHandler
public vodi EventHandler ( Object sender, EventArgs e)
(this, null ) 來匹配一致
三 需要傳輸數據時 自定義 EventArgs 派生類。
1. 首先定義 派生子 EventArgs 的類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace EventDemo.CustomerDefine 8 { 9 /* public void EventHandler(Object sender, EventArgs e) 10 * EventArgs 被設計為不能傳遞任何參數, 11 * 需要聲明派生自 EventArgs 的類,自定義保存數據的字段。 12 * 13 * 命名規範 以 Args結尾 14 */ 15 public class CustomerEventArgs : EventArgs 16 { 17 public int DestinateData { get; set; } 18 } 19 }自定義 EventArgs 派生類
2. 其余步驟同上,註意定義 事件處理程序時
1)返回值為 void。
2) Publisher
View Code
3)Subscribe
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace EventDemo.CustomerDefine 8 { 9 class SubscribeClass 10 { 11 public int transferData { get; set; } 12 13 public void AccountMethod(Object send, CustomerEventArgs e) 14 { 15 Console.WriteLine("{0} transfer data,/t {1} send", 16 e.DestinateData, send.ToString()); 17 transferData++; 18 } 19 public SubscribeClass(PublisherClass pc) 20 { 21 transferData = 0; 22 pc.handler += AccountMethod; 23 } 24 } 25 }View Code
註意 移除事件處理程序 是從最後的尋找第一個匹配的,類似於 委托的方法移除
高級用法, 事件訪問器
將 += -= 改變。 讓事件執行任何我們希望的自定義代碼。
兩個訪問器 add remove
聲明事件訪問器 類似於 聲明一個屬性 返回 void
public event EventHandler CountedADozen
{
add
{ ... } // 執行 += 運算符
remove
{ ... } // 執行 -= 運算符
}
聲明之後,事件不包含任何內嵌委托對象。必須實現自己的機制來存儲和移除時間註冊的方法。
Software--C#--grammer_Delegate--Event