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

C# 委派與事件完整指南:從宣告到實作

     編輯:關於C語言

核心概念:委派是事件的基石

在 C# 中,事件機制建立在委派之上。若要為類別建構事件,必須先使用 delegate 關鍵字定義一個委派類型,再以 event 關鍵字宣告該類型的欄位。這雙重機制確保了型別安全,並限制外部只能訂閱或取消訂閱,而不能直接觸發事件。

基本宣告語法

public class Test
{
    // 1. 定義委派類型
    public delegate void EventHandler(object sender, EventArgs e);

    // 2. 宣告事件
    public event EventHandler Load;
}

訂閱與觸發事件

建立類別實例後,使用 += 運算子註冊事件處理常式:

Test m = new Test();
m.Load += new Test.EventHandler(m_Load);

void m_Load(object sender, EventArgs e)
{
    MessageBox.Show("這是一個類別事件");
}

完整範例:多播事件與移除訂閱

以下程式碼示範如何註冊多個處理常式、移除特定訂閱,以及在類別內部觸發事件:

using System;

class TestClass
{
    static void Main(string[] args)
    {
        EventClass myEventClass = new EventClass();
        
        // 註冊兩個處理常式
        myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent1);
        myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent2);
        myEventClass.InvokeEvent(); // 觸發兩次
        
        // 移除其中一個
        myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);
        myEventClass.InvokeEvent(); // 僅觸發一次
        
        myEventClass.Load += new EventClass.CustomEventHandler(Load1);
        myEventClass.OnLoad();
    }

    private static void CustomEvent1(object sender, EventArgs e)
    {
        Console.WriteLine("觸發事件 1");
    }

    private static void CustomEvent2(object sender, EventArgs e)
    {
        Console.WriteLine("觸發事件 2");
    }

    private static void Load1(object sender, EventArgs e)
    {
        Console.WriteLine("目前背景色為 {0},請輸入:", Console.BackgroundColor.ToString());
    }
}

public class EventClass
{
    // 定義委派類型
    public delegate void CustomEventHandler(object sender, EventArgs e);

    // 宣告兩個事件
    public event CustomEventHandler CustomEvent;
    public event CustomEventHandler Load;

    public void InvokeEvent()
    {
        // 安全觸發:檢查是否有訂閱者
        CustomEvent?.Invoke(this, EventArgs.Empty);
    }

    public void OnLoad()
    {
        Console.BackgroundColor = ConsoleColor.Red;
        Load?.Invoke(this, EventArgs.Empty);
        
        string input = Console.ReadLine();
        if (input != "yuping")
        {
            Console.WriteLine("必須輸入 'yuping' 才能變更!");
        }
        else
        {
            Console.BackgroundColor = ConsoleColor.Black;
            Console.Clear();
        }
    }
}

委派使用的三步驟原則

正確使用委派必須遵循三個步驟:

  1. 宣告:定義委派類型,如 public delegate void CustomEventHandler(object sender, EventArgs e);
  2. 實例化:建立委派實例(事件欄位即是委派實例),如 public event CustomEventHandler CustomEvent;
  3. 調用:在適當時機呼叫委派,如 InvokeEvent() 方法中透過 CustomEvent(this, EventArgs.Empty); 觸發

關鍵注意事項

  • 委派簽章必須與事件處理常式完全一致(參數型別、順序、回傳型別)
  • 事件只能在宣告它的類別內部觸發(Invoke),外部只能 += / -=
  • 使用 ?.Invoke 可避免無訂閱者時擲出 NullReferenceException
  • 多播委派會按註冊順序依序呼叫所有處理常式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved