首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 事件處理機制深度解析與實作模式

     編輯:關於C語言

事件模型核心觀念

事件是物件發送的訊息,通知操作發生 (如使用者滑鼠點擊、程式邏輯觸發)。事件發送者 (Publisher) 引發事件,事件接收者 (Subscriber) 捕獲並回應。發送者不需知道誰會處理事件,兩者間需一個媒介——委派 提供型別安全的函式指標/回呼機制。委派具有簽章,僅能參考符合簽章的方法。

C# 使用事件的標準五步驟

  1. 建立委派型別
  2. 將委派與特定事件關聯 (宣告 event)
  3. 撰寫事件處理方法 (簽章必須符合委派)
  4. 利用處理方法建立委派實例
  5. 將委派實例透過 += 運算子加入發送者的事件清單 (訂閱事件)

事件產生與處理流程

  1. 定義發送者實例 A 與其事件 a
  2. 定義接收者實例 B 與處理方法 b
  3. A 因使用者/系統動作產生事件 a (如 Button Click)
  4. A 透過事件清單中的委派物件通知 B
  5. B 接收通知 (實際由 B.b 透過委派實現)
  6. 呼叫 B.b 完成事件處理

完整程式碼範例解析

1. 發送者類別 Connection

using 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 簽章的方法才能接收。

2. 接收者類別 Display

namespace Ch12Ex02 {
    public class Display {
        public void DisplayMessage(string message) {  // 步驟3: 事件處理方法
            Console.WriteLine("Message Arrived: {0}", message);
        }
    }
}

3. 主程式驗證


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 避免 NullReferenceException

進階補充

  • .NET 類別庫內建大量事件 (如 Button.Click、Timer.Elapsed) 已定義對應委派 (EventHandler、ElapsedEventHandler),直接使用即可。
  • 自訂事件引數可繼承 EventArgs 傳遞豐富資料。
  • C# 2.0+ 支援匿名方法/Lambda 簡化訂閱:myConnection.MessageArrived += (msg) => Console.WriteLine(msg);

結語

C# 事件模型以委派為核心,實現發送者與接收者的鬆耦合通訊。掌握「定義委派 → 宣告事件 → 撰寫處理器 → 訂閱事件」標準流程,並理解 += 多播機制與 null 檢查慣例,即能靈活運用事件驅動架構開發互動式應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved