天天看點

[轉] 自定義事件

關于事件各位應該都不陌生,相信每個程式員都可以拍着胸脯說“事件?我知道啊~”,可如何自定義事件?也許有人心中就不是那麼底氣十足了。

用很多地方都被引用到泛濫的一個例子來寫吧,始作俑者就不去深究了。描述是這樣的:小偷進入時,事件發送者(狗)發送狗叫事件(自定義),(事件接收者)主人訂閱狗叫事件并處理(抓住小偷),事件的參數傳遞的是小偷的數量。下面就給出實作的具體步驟---已經在代碼注釋中标明,以供各位博友抽象出自定義事件的流程。

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&lt;AlarmEventArgs&gt; 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&lt;AlarmEventArgs&gt;(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,如需轉載請自行聯系原作者