事件是物件發送的訊息,通知操作發生 (如使用者滑鼠點擊、程式邏輯觸發)。事件發送者 (Publisher) 引發事件,事件接收者 (Subscriber) 捕獲並回應。發送者不需知道誰會處理事件,兩者間需一個媒介——委派 提供型別安全的函式指標/回呼機制。委派具有簽章,僅能參考符合簽章的方法。
event)+= 運算子加入發送者的事件清單 (訂閱事件)Connectionusing System;
using System.Timers;
namespace Ch12Ex02 {
public delegate void MessageHandler(string messageText); // 步驟1: 定義委派
public class Connection {
public event MessageHandler MessageArrived; // 步驟2: 宣告事件並關聯委派
private Timer pollTimer;
public Connection() {
pollTimer = new Timer(100);
pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
}
public void Connect() { pollTimer.Start(); }
public void Disconnect() { pollTimer.Stop(); }
public void CheckForMessage(object sender, ElapsedEventArgs e) {
Console.WriteLine("Check for message.");
Random random = new Random();
if ((random.Next(9) == 0) && (MessageArrived != null)) {
MessageArrived("Hello Mum!"); // 觸發事件
}
}
}
}
關鍵點: MessageArrived 綁定 MessageHandler 委派後,所有訊息傳遞皆透過此委派。接收者必須提供符合 MessageHandler 簽章的方法才能接收。
Displaynamespace Ch12Ex02 {
public class Display {
public void DisplayMessage(string message) { // 步驟3: 事件處理方法
Console.WriteLine("Message Arrived: {0}", message);
}
}
}
using System;
namespace Ch12Ex02 {
class Class1 {
[STAThread]
static void Main(string[] args) {
Connection myConnection = new Connection();
Display myDisplay = new Display();
// 步驟4+5: 建立委派實例並訂閱事件
myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
myConnection.Connect();
Console.ReadLine();
}
}
}
public delegate void MessageHandler(string messageText); — 定義委派型別public event MessageHandler MessageArrived; — 宣告事件並綁定委派myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage); — += 運算子訂閱事件,可多播 (多個處理方法)!= null 避免 NullReferenceExceptionButton.Click、Timer.Elapsed) 已定義對應委派 (EventHandler、ElapsedEventHandler),直接使用即可。EventArgs 傳遞豐富資料。myConnection.MessageArrived += (msg) => Console.WriteLine(msg);C# 事件模型以委派為核心,實現發送者與接收者的鬆耦合通訊。掌握「定義委派 → 宣告事件 → 撰寫處理器 → 訂閱事件」標準流程,並理解 += 多播機制與 null 檢查慣例,即能靈活運用事件驅動架構開發互動式應用。