最近因為工作的事情想了很多,此處略去三千字吧。。。
還是把事件這個技術拿過來沉淀一下,繼續學習,繼續提高自己,好吧,廢話不多說,進入正題吧~
關於事件各位應該都不陌生,相信每個程序員都可以拍着胸脯說“事件?我知道啊~”,可如何自定義事件?也許有人心中就不是那么底氣十足了。還是老規矩吧,高手繞行~
用很多地方都被引用到泛濫的一個例子來寫吧,始作俑者就不去深究了。描述是這樣的:小偷進入時,事件發送者(狗)發送狗叫事件(自定義),(事件接收者)主人訂閱狗叫事件並處理(抓住小偷),事件的參數傳遞的是小偷的數量。
下面就給出實現的具體步驟---已經在代碼注釋中標明,以供各位博友抽象出自定義事件的流程。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 自定義事件 { //http://www.cnblogs.com/DebugLZQ //自定義事件步驟的示例代碼 //0.定義事件傳遞的參數 class AlarmEventArgs : EventArgs { public int numberOfThief; public AlarmEventArgs(int n) { numberOfThief = n; } } //事件的發出者 class Dog { //1.聲明事件的委托 public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e); //2.聲明事件 public event AlarmEventHandler Alarm; //3.引發事件的函數 public void OnAlarm(AlarmEventArgs e) { if (this.Alarm != null) { Console.WriteLine("The dog is Wangwang..."); this.Alarm(this, e); } } } //事件的訂閱者 class Host { //4.訂閱事件 public Host(Dog dog) { dog.Alarm += new Dog.AlarmEventHandler(HostHandleEvent); } //5.事件處理程序 public void HostHandleEvent(Object sender, AlarmEventArgs e) { Console.WriteLine("Host caught the thief! The sum is "+e.numberOfThief); } } class Program { static void Main(string[] args) { Console.WriteLine("Program is running..."); Dog dog = new Dog(); Host host = new Host(dog); Console.WriteLine("Someone is coming..."); //6.在合適的時候引發事件 AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3); dog.OnAlarm(alarmEventArgs); Console.ReadKey(); } } }
程序運行結果如下:
例子很簡單,我是按照順序寫的,在代碼中也有詳細的步驟注釋,就不多講了。一般經驗來講,自定義的東西往往是很有用的,而往往也不是人人能夠掌握,DebugLZQ總結了一下,也沒有什么高端的技術,遇到了自定義事件的這個事情,寫下來吧,心里也就不虛了~具體流程可能一千個人一千個哈姆雷特,看個人習慣~
本文自定義的CLR事件,關於自定義WPF的路由事件請參考:WPF 自定義路由事件
接下來英語口語要注意鍛煉,技術要繼續學習(重點是加強LINQ,WCF,WPF以及敏捷開發方面的知識),努力提高自己的專業素質,在此期間完成畢業論文。
時間又是很晚了~手指在鍵盤上流浪至天明吧~多么美麗的夜晚---So Beautiful !
=====================================================
Update:
我們可以使用.NET提供的EventHandler<TEventArgs> delegate來簡化,事件的定義及使用,提高開發效率和代碼質量~
如下(區別在步驟2和4,省略了1):
using System; namespace RefactorCustomizeEventDemo { //http://www.cnblogs.com/DebugLZQ //自定義事件步驟的示例代碼 //0.定義事件傳遞的參數 class AlarmEventArgs : EventArgs { public int numberOfThief; public AlarmEventArgs(int n) { numberOfThief = n; } } //事件的發出者 class Dog { //2.聲明事件 public event EventHandler<AlarmEventArgs> Alarm; //3.引發事件的函數 public void OnAlarm(AlarmEventArgs e) { if (Alarm != null) { Console.WriteLine("The dog is Wangwang..."); Alarm(this, e); } } } //事件的訂閱者 class Host { //4.訂閱事件 public Host(Dog dog) { // dog.Alarm += new EventHandler<AlarmEventArgs>(HostHandleEvent); // this line is equal to the next line dog.Alarm += HostHandleEvent; } //5.事件處理程序 public void HostHandleEvent(Object sender, AlarmEventArgs e) { Console.WriteLine("Host caught the thief! The sum is " + e.numberOfThief); } } class Program { static void Main(string[] args) { Console.WriteLine("Program is running..."); Dog dog = new Dog(); Host host = new Host(dog); Console.WriteLine("Someone is coming..."); //6.在合適的時候引發事件 AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3); dog.OnAlarm(alarmEventArgs); Console.ReadKey(); } } }
步驟2:申明事件的最佳實踐如下:
//2.聲明事件 public event EventHandler<AlarmEventArgs> Alarm= delegate { };
程序運行如下:
Update:
請參考DebugLZQ后續博文:
WPF 4.5 New Feature:Using the WeakEvent pattern with WeakEventManager to avoid memory leaking
[C#] A simple implementation of the WeakEvent pattern
希望對你有幫助~