.NET自定義事件小結


最近因為工作的事情想了很多,此處略去三千字吧。。。

還是把事件這個技術拿過來沉淀一下,繼續學習,繼續提高自己,好吧,廢話不多說,進入正題吧~

關於事件各位應該都不陌生,相信每個程序員都可以拍着胸脯說“事件?我知道啊~”,可如何自定義事件?也許有人心中就不是那么底氣十足了。還是老規矩吧,高手繞行~

用很多地方都被引用到泛濫的一個例子來寫吧,始作俑者就不去深究了。描述是這樣的:小偷進入時,事件發送者(狗)發送狗叫事件(自定義),(事件接收者)主人訂閱狗叫事件並處理(抓住小偷),事件的參數傳遞的是小偷的數量。

下面就給出實現的具體步驟---已經在代碼注釋中標明,以供各位博友抽象出自定義事件的流程。

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

 

希望對你有幫助~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM