事件(Event)
基本上說是一個用戶操作,如按鍵、點擊、鼠標移動等等,或者是一些提示信息,如系統生成的通知。應用程序需要在事件發生時響應事件。例如,中斷。
C# 中使用事件機制實現線程間的通信。
通過事件使用委托
事件在類中聲明且生成,且通過使用同一個類或其他類中的委托與事件處理程序關聯。包含事件的類用於發布事件。這被稱為 發布器(publisher) 類。其他接受該事件的類被稱為 訂閱器(subscriber) 類。事件使用 發布-訂閱(publisher-subscriber) 模型。
發布器(publisher) 是一個包含事件和委托定義的對象。事件和委托之間的聯系也定義在這個對象中。發布器(publisher)類的對象調用這個事件,並通知其他的對象。
訂閱器(subscriber) 是一個接受事件並提供事件處理程序的對象。在發布器(publisher)類中的委托調用訂閱器(subscriber)類中的方法(事件處理程序)。
聲明事件(Event)
在類的內部聲明事件,首先必須聲明該事件的委托類型。例如:
public delegate void BoilerLogHandler(string status);
然后,聲明事件本身,使用 event 關鍵字:
// 基於上面的委托定義事件
public event BoilerLogHandler BoilerEventLog;
上面的代碼定義了一個名為 BoilerLogHandler 的委托和一個名為 BoilerEventLog 的事件,該事件在生成的時候會調用委托。
事件和委托的聯系與區別
從事件的聲明,我們可以大致看出事件與委托的關系,事件是委托的特殊實現,事件是建立在對委托的語言支持之上的。
委托是一種類型,事件是委托類型的一個實例,加上了event的權限控制,限制權限,只允許在事件聲明類里面去invoke和賦值,不允許外面,甚至子類調用。
經典面試題—貓叫,主人醒,老鼠跑
using System; namespace DelegateDemo { //定義貓叫委托
public delegate void CatCallEventHandler(); public class Cat { //定義貓叫事件
public event CatCallEventHandler CatCall; public void OnCatCall() { Console.WriteLine("貓叫了一聲"); CatCall?.Invoke(); } } public class Mouse { //定義老鼠跑掉方法
public void MouseRun() { Console.WriteLine("老鼠跑了"); } } public class People { //定義主人醒來方法
public void WakeUp() { Console.WriteLine("主人醒了"); } } class Program { static void Main(string[] args) { Cat cat = new Cat(); Mouse m = new Mouse(); People p = new People(); //關聯綁定
cat.CatCall += new CatCallEventHandler(m.MouseRun); cat.CatCall += new CatCallEventHandler(p.WakeUp); cat.OnCatCall(); Console.ReadKey(); } } }
運行結果: