1. 程式人生 > >Software--C#--grammer_Delegate--Event

Software--C#--grammer_Delegate--Event

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 EventDemo
8 { 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 }
View Code

2. 訂閱者中 創建事件處理程序 及 註冊事件。

技術分享圖片
 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 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 }
View Code

二 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