C# 事件 Event


一、事件是什么

微軟的定義:和委托類似,事件是后期綁定機制。 實際上,事件是建立在對委托的語言支持之上的。事件是對象用於(向系統中的所有相關組件)廣播已發生事情的一種方式。 任何其他組件都可以訂閱事件,並在事件引發時得到通知。

簡單的來說,鼠標移動、點擊等等都是一個事件。但並非唯一的情景。可以定義應針對類引發的事件。通過訂閱事件,還可在兩個對象(事件源和事件接收器)之間創建耦合。 需要確保當不再對事件感興趣時,事件接收器將從事件源取消訂閱。

事件在類中聲明且生成,且通過使用同一個類或其他類中的委托與事件處理程序關聯。包含事件的類用於發布事件。這被稱為 發布器(publisher) 類。其他接受該事件的類被稱為 訂閱器(subscriber) 類。事件使用 發布-訂閱(publisher-subscriber) 模型。

發布器(publisher) 是一個包含事件和委托定義的對象。事件和委托之間的聯系也定義在這個對象中。發布器(publisher)類的對象調用這個事件,並通知其他的對象。

訂閱器(subscriber) 是一個接受事件並提供事件處理程序的對象。在發布器(publisher)類中的委托調用訂閱器(subscriber)類中的方法(事件處理程序)。

二、事件的聲明

#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll
#endregion

using System.Runtime.InteropServices;

namespace System
{
    //
    // 摘要:
    //     表示將處理不包含事件數據的事件的方法。
    //
    // 參數:
    //   sender:
    //     事件源。
    //
    //   e:
    //     不包含事件數據的對象。
    [ComVisible(true)]
    public delegate void EventHandler(object sender, EventArgs e);
}
EventHandler

F12查看EventHandler我們可以發現它其實就是一個委托,在委托前面加上關鍵字event 就聲明好了一個事件,如:public event EventHandler StartHandler;

.NET 事件委托的標准簽名是:void OnEventRaised(object sender, EventArgs args);

返回類型為 void。 事件基於委托,而且是多播委托。參數列表包含兩種參數:發件人和事件參數。 sender 的編譯時類型為 System.Object,即使有一個始終正確的更底層派生的類型亦是如此。第二種參數通常是派生自 System.EventArgs 的類型。即使事件類型無需任何其他參數,你仍將提供這兩種參數。 應使用特殊值 EventArgs.Empty 來表示事件不包含任何附加信息。

三、事件和委托的聯系與區別

從事件的聲明,我們可以大致看出事件與委托的關系,事件是委托的特殊實現,事件是建立在對委托的語言支持之上的。

委托是一種類型,事件是委托類型的一個實例,加上了event的權限控制,限制權限,只允許在事件聲明類里面去invoke和賦值,不允許外面,甚至子類調用。

        //貓 叫一聲   觸發一系列后續動作  
        //多了個 指定動作  正是這個不穩定   封裝出去   甩鍋
         public event Action CatMiaoActionHandler;
         public void MiaoEvent()
        {
            Console.WriteLine("{0} MiaoEvent", this.GetType().Name);
            this.CatMiaoActionHandler?.Invoke();
            Console.WriteLine("*&^&*^*^*(^&*^&*^&*^&*^");
        }
CatMiaoActionHandler
 
                    Cat cat = new Cat();
                    
                    cat.CatMiaoActionHandler += new Dog().Wang;
                    cat.CatMiaoActionHandler += new Mouse().Run;
                    cat.CatMiaoActionHandler += new Baby().Cry;

                    //cat.CatMiaoActionHandler.Invoke();
                    //cat.CatMiaoActionHandler = null;

                    cat.CatMiaoActionHandler += new Mother().Wispher;
                    cat.CatMiaoActionHandler += new Brother().Turn;
                    cat.CatMiaoActionHandler += new Father().Roar;
                    cat.CatMiaoActionHandler += new Neighbor().Awake;
                    cat.CatMiaoActionHandler += new Stealer().Hide;
                    cat.MiaoEvent();
cat.MiaoEvent();

本文參考文檔:https://www.cnblogs.com/loverwangshan/p/10153171.html;

http://www.runoob.com/csharp/csharp-event.html;

微軟文檔地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview;


免責聲明!

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



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