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
注意事項
- 使用
+=加入方法,-=移除方法 - 有回傳值的多播委託,只保留最後一個方法的回傳值
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️⃣ 核心理解
- 委託 = 方法的變數,可單播或多播
- 多播委託 = 可以同時指向多個方法
- 事件 = 封裝多播委託,用於通知、保障安全觸發
- 事件訂閱者(listener)是「觀察者模式」的典型應用
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953969.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!