委托和事件(Delegate & Event)※
委托(delegate)是 C# 中的类型安全的函数指针,事件(event)是基于委托的发布-订阅机制。
委托※
// 声明委托类型
public delegate int MathOp(int a, int b);
// 使用
MathOp add = (a, b) => a + b;
MathOp sub = (a, b) => a - b;
Console.WriteLine(add(3, 4)); // 7
// 多播委托
MathOp op = add;
op += sub;
// 多播委托返回值取最后一个方法的返回值
事件※
public class Button
{
// 声明事件
public event EventHandler? Clicked;
public void Click()
{
Clicked?.Invoke(this, EventArgs.Empty);
}
}
// 订阅
var btn = new Button();
btn.Clicked += (s, e) => Console.WriteLine("Button clicked!");
btn.Click();
内置委托※
Action<T> // 无返回值委托
Func<T, R> // 有返回值委托
Predicate<T> // 返回 bool 的委托
事件 vs 委托※
- 事件只能在声明它的类内部 Invoke,外部只能 += / -=
- 委托可以在外部任意调用
- 事件是"通知",委托是"回调"