一、事件是什么
微軟的定義:和委托類似,事件是后期綁定機制。 實際上,事件是建立在對委托的語言支持之上的。事件是對象用於(向系統中的所有相關組件)廣播已發生事情的一種方式。 任何其他組件都可以訂閱事件,並在事件引發時得到通知。
簡單的來說,鼠標移動、點擊等等都是一個事件。但並非唯一的情景。可以定義應針對類引發的事件。通過訂閱事件,還可在兩個對象(事件源和事件接收器)之間創建耦合。 需要確保當不再對事件感興趣時,事件接收器將從事件源取消訂閱。
事件在類中聲明且生成,且通過使用同一個類或其他類中的委托與事件處理程序關聯。包含事件的類用於發布事件。這被稱為 發布器(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); }
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("*&^&*^*^*(^&*^&*^&*^&*^"); }

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();
本文參考文檔: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;