委托和事件实际用途
目录
场景 1:GUI(WinForm / WPF / MAUI)事件系统 —— 最直观的事件使用
button.Click += Button_Click;本质就是:
- Click 是一个 event
- Button_Click 是一个委托(方法)
- 用户点击按钮 -> 事件触发 -> 执行方法
为什么 GUI 用事件?
因为:
GUI 是“外界触发,我来响应”的典型模型。
用户点、移、拖,都可以视为“江湖上的突发事件”。
例子:
private void Button_Click(object sender, EventArgs e)
{
MessageBox.Show("你点我干嘛!");
}场景 2:MVVM(WPF/Prism)中的事件通知
- INotifyPropertyChanged
- PropertyChangedEventHandler
- 事件聚合器(EventAggregator 事件总线)
比如改变属性后通知 UI 刷新:
public event PropertyChangedEventHandler? PropertyChanged;这让 ViewModel 能通知 View:
“我内部的值变了,你们都刷新一下 UI。”
这又是事件最典型的用途:
状态变化通知。
继续武侠比喻:
一个门派宣布:掌门换人了(事件)
整个江湖的弟子(UI 绑定)都知道了并自动更新
场景 3:事件总线(EventBus / EventAggregator)—— 模块间通信
Prism 的例子:
_eventAggregator.GetEvent<UserChangedEvent>().Publish(user);事件总线是“江湖传音系统”。
A 门派发布消息,所有订阅者都能收到,不需要知道彼此是谁。
非常适合:
- 模块之间解耦通信
- 大型项目中跨模块的通知机制
- 多层架构(UI,Service)之间的消息传递
场景 4:异步操作的回调(Callback)
委托非常适合:
- 异步下载完成
- 定时任务执行
- 网络请求返回后触发回调
例子:
public void Download(string url, Action<int> progress, Action finished)
{
for (int i = 0; i <= 100; i++)
{
progress(i);
}
finished();
}使用:
Download("xxx",
p => Console.WriteLine($"进度:{p}%"),
() => Console.WriteLine("下载完成!")
);委托在这里就是典型的:
告诉别人“任务完成后要干什么”。
事件 + 委托的组合就非常适合“任务完成通知”。
总结:委托 vs 事件 在项目中分别承担什么
委托(Delegate)
更像武功秘籍:
- 记录“招式”
- 可以直接执行方法
- 用于回调、策略模式、行为传递
例:
Action onDone;事件(Event)
更像“门派广播系统”:
- 谁触发,谁订阅
- 防止滥用(只能在类内部触发)
- 用于消息通知、点击事件、状态变化
例:
public event EventHandler SomethingChanged;抽象类 = 天赋
接口 = 后天学的功法
委托 = 具体的一招一式(招式本身)
事件 = 门派广播某个弟子“施展了某招”,所有人都可以知道