關于事件各位應該都不陌生,相信每個程式員都可以拍着胸脯說“事件?我知道啊~”,可如何自定義事件?也許有人心中就不是那麼底氣十足了。
用很多地方都被引用到泛濫的一個例子來寫吧,始作俑者就不去深究了。描述是這樣的:小偷進入時,事件發送者(狗)發送狗叫事件(自定義),(事件接收者)主人訂閱狗叫事件并處理(抓住小偷),事件的參數傳遞的是小偷的數量。下面就給出實作的具體步驟---已經在代碼注釋中标明,以供各位博友抽象出自定義事件的流程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<code>using</code> <code>System;</code>
<code>using</code> <code>System.Collections.Generic;</code>
<code>using</code> <code>System.Linq;</code>
<code>using</code> <code>System.Text;</code>
<code>namespace</code> <code>自定義事件</code>
<code>{</code>
<code> </code><code>//http://www.cnblogs.com/DebugLZQ</code>
<code> </code><code>//自定義事件步驟的示例代碼</code>
<code> </code><code>//0.定義事件傳遞的參數</code>
<code> </code><code>class</code> <code>AlarmEventArgs : EventArgs</code>
<code> </code><code>{</code>
<code> </code><code>public</code> <code>int</code> <code>numberOfThief;</code>
<code> </code><code>public</code> <code>AlarmEventArgs(</code><code>int</code> <code>n)</code>
<code> </code><code>{</code>
<code> </code><code>numberOfThief = n;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>//事件的發出者</code>
<code> </code><code>class</code> <code>Dog</code>
<code> </code><code>//1.聲明事件的委托</code>
<code> </code><code>public</code> <code>delegate</code> <code>void</code> <code>AlarmEventHandler(Object sender, AlarmEventArgs e);</code>
<code> </code><code>//2.聲明事件</code>
<code> </code><code>public</code> <code>event</code> <code>AlarmEventHandler Alarm;</code>
<code> </code><code>//3.引發事件的函數</code>
<code> </code><code>public</code> <code>void</code> <code>OnAlarm(AlarmEventArgs e)</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>.Alarm != </code><code>null</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>Console.WriteLine(</code><code>"The dog is Wangwang..."</code><code>);</code>
<code> </code><code>this</code><code>.Alarm(</code><code>this</code><code>, e); </code>
<code> </code><code>}</code>
<code> </code><code>//事件的訂閱者</code>
<code> </code><code>class</code> <code>Host</code>
<code> </code><code>//4.訂閱事件</code>
<code> </code><code>public</code> <code>Host(Dog dog)</code>
<code> </code><code>dog.Alarm += </code><code>new</code> <code>Dog.AlarmEventHandler(HostHandleEvent);</code>
<code> </code><code>//5.事件處理程式</code>
<code> </code><code>public</code> <code>void</code> <code>HostHandleEvent(Object sender, AlarmEventArgs e)</code>
<code> </code><code>Console.WriteLine(</code><code>"Host caught the thief! The sum is "</code><code>+e.numberOfThief);</code>
<code> </code>
<code> </code><code>class</code> <code>Program</code>
<code> </code><code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>
<code> </code>
<code> </code><code>Console.WriteLine(</code><code>"Program is running..."</code><code>);</code>
<code> </code><code>Dog dog = </code><code>new</code> <code>Dog();</code>
<code> </code><code>Host host = </code><code>new</code> <code>Host(dog);</code>
<code> </code><code>Console.WriteLine(</code><code>"Someone is coming..."</code><code>);</code>
<code> </code><code>//6.在合适的時候引發事件</code>
<code> </code><code>AlarmEventArgs alarmEventArgs = </code><code>new</code> <code>AlarmEventArgs(3);</code>
<code> </code><code>dog.OnAlarm(alarmEventArgs);</code>
<code> </code><code>Console.ReadKey();</code>
<code>}</code>
程式運作結果如下:
例子很簡單,我是按照順序寫的,在代碼中也有詳細的步驟注釋,就不多講了。一般經驗來講,自定義的東西往往是很有用的,而往往也不是人人能夠掌 握,DebugLZQ總結了一下,也沒有什麼高端的技術,遇到了自定義事件的這個事情,寫下來吧,心裡也就不虛了~具體流程可能一千個人一千個哈姆雷特, 看個人習慣~
接下來英語口語要注意鍛煉,技術要繼續學習(重點是加強LINQ,WCF,WPF以及靈活開發方面的知識),努力提高自己的專業素質,在此期間完成畢業論文。
時間又是很晚了~手指在鍵盤上流浪至天明吧~多麼美麗的夜晚---So Beautiful !
=====================================================
Update:
如下(差別在步驟2和4,省略了1):
<code>namespace</code> <code>RefactorCustomizeEventDemo</code>
<code> </code><code>public</code> <code>int</code> <code>numberOfThief;</code>
<code> </code><code>public</code> <code>event</code> <code>EventHandler<AlarmEventArgs> Alarm;</code>
<code> </code><code>if</code> <code>(Alarm != </code><code>null</code><code>)</code>
<code> </code><code>Alarm(</code><code>this</code><code>, e);</code>
<code> </code><code>// dog.Alarm += new EventHandler<AlarmEventArgs>(HostHandleEvent); // this line is equal to the next line</code>
<code> </code><code>dog.Alarm += HostHandleEvent;</code>
<code> </code><code>Console.WriteLine(</code><code>"Host caught the thief! The sum is "</code> <code>+ e.numberOfThief);</code>
步驟2:申明事件的最佳實踐如下:
程式運作如下:
請參考DebugLZQ後續博文:
<a href="http://www.cnblogs.com/DebugLZQ/p/3498620.html">WPF 4.5 New Feature:Using the WeakEvent pattern with WeakEventManager to avoid memory leaking</a>
<a href="http://www.cnblogs.com/DebugLZQ/p/3873264.html">[C#] A simple implementation of the WeakEvent pattern</a>
沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。
本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/arxive/p/5844498.html,如需轉載請自行聯系原作者