委托与事件 Delegate 和 Event
委托 Delegate 可以理解为"方法的类型"——它把方法当参数传递,或者存起来以后调用。事件 event 是特殊的委托,外部只能 += 或 -= 订阅,不能直接赋值,这样就不会意外覆盖别人的订阅。
自己第一次理解委托是在写按钮点击事件的时候:按钮不知道你点击后要做什么,它只持有一个委托,你把方法传给它,点击时它调用这个委托。多播委托 += 可以订阅多个方法,-= 取消订阅。
注意事项:1) 事件外部不能直接 Invoke,类内部用 OnEvent?.Invoke();2) 不用时记得 -= 取消订阅,否则内存泄漏;3) Action 是无返回值委托,Func 是有返回值委托。
代码示例
// 声明委托
public delegate void Notify(string message);
// 事件发布者
public class Publisher
{
public event Action<string>? OnSaved;
public void Save()
{
// ... 保存逻辑 ...
OnSaved?.Invoke("保存成功");
}
}
// 订阅
var pub = new Publisher();
pub.OnSaved += msg => Console.WriteLine($"收到:{msg}");
pub.OnSaved += msg => Logger.Log(msg);
pub.Save(); // 两个订阅都会被调用
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。