您好,登錄后才能下訂單哦!
一、事件的感性認識:
現實生活中的“事件”無所不在,時刻都在發生,軟件層面上的常見事件無非是鼠標事件、鍵盤事件、操作系統自己發出的事件。
事件的發送方稱作為發布者(sender),接收事件的一方稱作訂閱者(receiver),一個事件可以有多個訂閱者。 一個訂閱者可處理來自多個發布者的多個事件。典型的多對多關系。
發布者和訂閱者互相都不了解,只是通過Delegate委托來在之間交互,委托在這里起到了“媒人”作用。同時.net的事件機制很容易實現設計模式的觀察者模式。
二、事件的不嚴格定義:
1) 事件是特殊類型的多路廣播委托
2) 向其他類或對象提供通知的一種方式。
三、例子:
MSDN上有幾個例子,我綜合了下,作為編寫事件的模板吧
1:
2: using System;
3: using System.Collections.Generic;
4: using System.Linq;
5: using System.Text;
6:
7: namespace CSharp.Event
8: {
9: public delegate void MyEventHandler(string s);
10:
11: public interface IPublisher
12: {
13: // 接口可聲明事件。
14: event EventHandler<CustomEventArgs> RaiseCustomEvent;
15: //自定義事件訪問器,可選
16: event MyEventHandler OnMyEvent;
17: }
18:
19: /// <summary>
20: /// 自定義EventArgs類,用來保存事件信息
21: /// </summary>
22: public class CustomEventArgs : EventArgs
23: {
24: private string message;
25:
26: public string Message
27: {
28: get { return message; }
29: set { message = value; }
30: }
31:
32: public CustomEventArgs(string s)
33: {
34: message = s;
35: }
36:
37: }
38:
39: /// <summary>
40: /// 發布者
41: /// </summary>
42: class Publisher : IPublisher
43: {
44: object objectLock = new Object();
45: //使用EventHandler<T> 聲明事件
46: public event EventHandler<CustomEventArgs> RaiseCustomEvent;
47: private event MyEventHandler _myEventHandler;
48:
49: /// <summary>
50: /// 在大多數情況下都不需要提供自定義的事件訪問器。
51: /// 如果您在代碼中沒有提供自定義的事件訪問器,編譯器會自動添加事件訪問器。
52: /// </summary>
53: public event MyEventHandler OnMyEvent
54: {
55: add
56: {
57: lock (objectLock)
58: {
59: _myEventHandler += value;
60: }
61: }
62: remove
63: {
64: lock (objectLock)
65: {
66: _myEventHandler -= value;
67: }
68: }
69: }
70:
71: public void DoSomething()
72: {
73: //省略。。。
74:
75: //自己引發事件
76: OnRaiseCustomEvent(new CustomEventArgs("Did something"));
77: //省略。。。
78:
79: if (_myEventHandler != null)
80: {
81:
82: _myEventHandler("你輕輕的走,不帶走一片云彩!");
83: }
84:
85: }
86:
87: /// <summary>
88: /// 公開protected virtual方法,允許繼承類重寫事件調用行為
89: /// </summary>
90: /// <param name="e"></param>
91: protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
92: {
93: EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
94:
95: //如果沒有訂閱者,事件為空
96: if (handler != null)
97: {
98: e.Message += String.Format(" at {0}", DateTime.Now.ToString());
99:
100: //觸發事件
101: handler(this, e);
102: }
103: }
104:
105:
106: }
107:
108: /// <summary>
109: /// 訂閱者
110: /// </summary>
111: class Subscriber
112: {
113: private string id;
114: public Subscriber(string ID, Publisher pub)
115: {
116: id = ID;
117: //多路廣播委托實現事件訂閱
118: pub.RaiseCustomEvent += HandleCustomEvent;
119: pub.OnMyEvent += new MyEventHandler(pub_OnMyEvent);
120: }
121:
122: void pub_OnMyEvent(string s)
123: {
124: Console.WriteLine(string.Format("{0} 的開場白:{1}", id, s));
125: }
126:
127: /// <summary>
128: /// 當訂閱者接收到事件,該做什么反應
129: /// 也就是常說的事件處理邏輯
130: /// </summary>
131: /// <param name="sender"></param>
132: /// <param name="e"></param>
133: void HandleCustomEvent(object sender, CustomEventArgs e)
134: {
135: Console.WriteLine(id + " received this message: {0}", e.Message);
136: }
137: }
138:
139: class Program
140: {
141: static void Main(string[] args)
142: {
143: //實例一個發布者
144: Publisher pub = new Publisher();
145: //實例兩個訂閱者sub1,sub2,他們計劃收聽pub
146: Subscriber sub1 = new Subscriber("sub1", pub);
147: Subscriber sub2 = new Subscriber("sub2", pub);
148:
149: //發布者通過DoSomething觸發事件,開始發布信息
150: pub.DoSomething();
151:
152: Console.WriteLine("Press Enter to close this window.");
153: Console.ReadLine();
154: }
155: }
156: }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。