目录

委托和事件实际用途

场景 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;

抽象类 = 天赋
接口 = 后天学的功法
委托 = 具体的一招一式(招式本身)
事件 = 门派广播某个弟子“施展了某招”,所有人都可以知道