一、事件的感性認識:
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)十年經(jīng)驗成就非凡,專業(yè)從事成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計,成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文營銷,廣告投放等。十年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:028-86922220,我們期待您的來電!現(xiàn)實生活中的“事件”無所不在,時刻都在發(fā)生,軟件層面上的常見事件無非是鼠標事件、鍵盤事件、操作系統(tǒng)自己發(fā)出的事件。
事件的發(fā)送方稱作為發(fā)布者(sender),接收事件的一方稱作訂閱者(receiver),一個事件可以有多個訂閱者。 一個訂閱者可處理來自多個發(fā)布者的多個事件。典型的多對多關(guān)系。
發(fā)布者和訂閱者互相都不了解,只是通過Delegate委托來在之間交互,委托在這里起到了“媒人”作用。同時.net的事件機制很容易實現(xiàn)設(shè)計模式的觀察者模式。
二、事件的不嚴格定義:
1) 事件是特殊類型的多路廣播委托
2) 向其他類或?qū)ο筇峁┩ㄖ囊环N方式。
三、例子:
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: /// 發(fā)布者
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: /// 在大多數(shù)情況下都不需要提供自定義的事件訪問器。
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: //自己引發(fā)事件
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方法,允許繼承類重寫事件調(diào)用行為
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: //觸發(fā)事件
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: //多路廣播委托實現(xiàn)事件訂閱
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: /// 當(dāng)訂閱者接收到事件,該做什么反應(yīng)
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: //實例一個發(fā)布者
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: //發(fā)布者通過DoSomething觸發(fā)事件,開始發(fā)布信息
150: pub.DoSomething();
151:
152: Console.WriteLine("Press Enter to close this window.");
153: Console.ReadLine();
154: }
155: }
156: }
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
網(wǎng)頁名稱:C#語言知識點整理-事件-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article34/idise.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、域名注冊、App開發(fā)、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)