C# 委托与事件——从观察者模式说起
摘要: 解析 C# 中委托(Delegate)和事件(Event)的关系,以及它们在设计模式中的应用。
在重构一个旧的后台服务时,我又一次用到了委托。对于初学者来说,委托就像是一个“函数指针”,但在 C# 中它更加安全和强大。
什么是委托?
委托是一种类型,它定义了方法的签名。可以将任何具有兼容签名的方法分配给该委托实例。
csharpcsharppublic delegate void PrintString(string s);
事件的应用
事件是基于委托封装的,主要目的是为了封装安全性,防止外部随意重置委托链。
在观察者模式中,Subject(主题)维护一个 Observer(观察者)列表,当状态变化时通知它们。在 C# 中,这天然可以通过 event关键字实现:
csharpcsharppublic class Publisher {
public event EventHandler<EventArgs> OnDataChanged;
protected virtual void DataChanged() {
OnDataChanged?.Invoke(this, EventArgs.Empty);
}
}
合理使用 event可以让代码结构更加清晰,降低模块间的耦合度。