最近在總結一些基礎的東西,主要是學起來很難懂,但是在日常又有可能會經常用到的東西。前面介紹了 C# 的 AutoResetEvent的使用介紹, 這次介紹事件(event)。
事件(event),對於初學者來說,確實比較神秘,難懂。但是在日常編程過程中卻經常遇到。事件使用得當,會讓你的代碼更加整潔,也能少些很多代碼。
一、Event事件,是一種封裝過的委托。
它擁有以下三要素:
1. 事件發行者:達到某些條件時激發事件的對象
2. 事件訂閱者:訂閱事件並對事件發生時進行處理的對象
3. 定義發行者和訂閱者關系,一個發行者可能會有多個訂閱者。
事件發行者和事件訂閱者通過委托(delegate) 來實現發送方和接收方的事件觸發。
它擁有哪些好處:
在以往我們編寫訂閱這類程序中,往往采用等待機制,為了等待某件事情的發生,需要不斷地檢測事情什么時候發生,而通過事件(event),可以大大簡化了這種過程:
1. 使用事件,可以很方便地確定程序執行順序。
2. 當事件驅動程序等待事件時,它不占用很多資源。事件驅動程序與過程式程序最大的不同就在於,程序不再不停地檢查輸入設備,而是呆着不動,等待消息的到來,每個輸入的消息會被排進隊列,等待程序處理它。如果沒有消息在等待,則程序會把控制交回給操作系統,以運行其他程序。
3. 事件簡化了編程。事件訂閱者只是簡單地將消息傳送給事件發行者,由發行者的事件驅動程序確定事件的處理方法。不必知道程序的內部訂閱觸發機制,只是需要知道如何傳遞消息即可。
二、事件和委托的區別
1.委托允許直接通過委托去訪問相應的處理函數,而事件只能通過公布的回調函數去調用,
2.事件只能通過“+=”,“-=”方式注冊和取消訂戶處理函數,而委托除此之外還可以使用“=”直接賦值處理函數。
三、事件的聲明(Event)
在類的內部聲明事件,首先必須聲明該事件的委托類型。例如:
public delegate void NumManipulationHandler(NumEventArgs e);
然后,聲明事件本身,使用 event 關鍵字:
// 基於上面的委托定義事件 public event NumManipulationHandler ChangeNum;
上面的代碼定義了一個名為 NumManipulationHandler 的委托和一個名為 ChangeNum 的事件,該事件是在某個值生成的時候會調用委托事件。
四、實例
public class Program { public static void Main() { NumEvent even = new NumEvent(0); even.ChangeNum += EventAction.Action; even.SetValue(7); even.SetValue(11); System.Console.ReadKey(); } } public class NumEvent { private int value; public delegate void NumManipulationHandler(NumEventArgs e); public event NumManipulationHandler ChangeNum; public virtual void OnChangeNum(NumEventArgs e) { ChangeNum?.Invoke(e); } public NumEvent(int n) { SetValue(n); } public void SetValue(int n) { if (value != n) { NumEventArgs e = new NumEventArgs(n); value = n; OnChangeNum(e); } } } public class EventAction { public static void Action(NumEventArgs e) { System.Console.WriteLine("value : " + e.value); } } public class NumEventArgs : EventArgs { public int value; public NumEventArgs(int _value) { this.value = _value; } }
