C# 委託(Delegate)與事件(Event)筆記

📝 C# 委託(Delegate)與事件(Event)筆記

1️⃣ 委託(Delegate)

定義

委託是一種方法指標(方法的變數),可以存放、傳遞方法。

// 定義委託
delegate void MyDelegate(string message);

// 方法符合委託簽名
void SayHello(string msg) => Console.WriteLine("Hello " + msg);

// 使用委託
MyDelegate d = SayHello;
d("World"); // Hello World

特性

  • 可以指向一個或多個方法
  • 方法簽名必須與委託一致
  • 支持 多播(Multicast)

2️⃣ 多播委託(Multicast Delegate)

概念

一個委託可以同時指向多個方法,呼叫時依序執行。

void Hello() => Console.WriteLine("Hello");
void World() => Console.WriteLine("World");

MyDelegate d = Hello;
d += World; // 加入另一個方法

d(); 
// 輸出:
// Hello
// World

注意事項

  1. 使用 += 加入方法,-= 移除方法
  2. 有回傳值的多播委託,只保留最後一個方法的回傳值
delegate int MyDelegate();

int A() { Console.WriteLine("A"); return 1; }
int B() { Console.WriteLine("B"); return 2; }

MyDelegate d = A;
d += B;

int result = d(); // 呼叫 A 和 B
Console.WriteLine(result); // 2

3️⃣ 事件(Event)

定義

事件是封裝好的多播委託,提供安全的通知機制。
外部只能訂閱(+=)或退訂(-=),不能直接觸發事件。

public class Button
{
    public event Action? OnClick; // 定義事件

    public void Click() // 事件觸發方法(只能在類內呼叫)
    {
        OnClick?.Invoke();
    }
}

使用方式

var button = new Button();

// 訂閱事件
button.OnClick += () => Console.WriteLine("Listener 1");
button.OnClick += () => Console.WriteLine("Listener 2");

// 觸發事件
button.Click();
// 輸出:
// Listener 1
// Listener 2

4️⃣ 委託 vs 事件對比

比較項 委託(Delegate) 事件(Event)
本質 方法指標 封裝的多播委託
外部可否訂閱
外部可否觸發 ❌(只能類內觸發)
常用場景 傳遞方法、回呼函式 UI事件、資料變更通知
多播 支援 支援

5️⃣ 常用技巧

  • 安全觸發事件
OnClick?.Invoke(); // ?避免 null reference
  • 查看多播委託清單
foreach (var m in d.GetInvocationList())
{
    Console.WriteLine(m.Method.Name);
}
  • 事件參數
public event EventHandler? OnCompleted;

void RaiseEvent() => OnCompleted?.Invoke(this, EventArgs.Empty);

6️⃣ 核心理解

  1. 委託 = 方法的變數,可單播或多播
  2. 多播委託 = 可以同時指向多個方法
  3. 事件 = 封裝多播委託,用於通知、保障安全觸發
  4. 事件訂閱者(listener)是「觀察者模式」的典型應用

posted on 2025-11-03 03:26  lamkuanthedev  阅读(5)  评论(0)    收藏  举报

导航