委托、事件与 Lambda
delegate/Func/Action、event 事件、+=/-= 订阅、匿名方法
委托、事件与 Lambda
委托是 C# 的"函数指针++"——类型安全的方法引用。事件是基于委托的发布-订阅模式。
学完本章你将: 掌握 delegate/Func/Action、event 事件、+=/-= 订阅。
委托基础
csharp
// 自定义委托
public delegate int Operation(int a, int b);
// 或使用内置泛型委托
Func<int, int, int> add = (a, b) => a + b;
Action<string> log = msg => Console.WriteLine(msg);
Predicate<int> isPositive = n => n > 0;
Console.WriteLine(add(3, 5)); // 8
多播委托
csharp
Action<string> logger = null;
logger += msg => Console.WriteLine($"[INFO] {msg}");
logger += msg => File.AppendAllText("log.txt", msg + "\n");
logger("Hello"); // 两个方法都会执行
logger -= /* 可以取消订阅 */;
事件 —— 安全的发布-订阅
csharp
public class Button
{
// event 关键字防止外部直接赋值
public event EventHandler? Clicked;
public void Click()
{
Console.WriteLine("按钮被按下");
Clicked?.Invoke(this, EventArgs.Empty); // 触发事件
}
}
var btn = new Button();
btn.Clicked += (sender, args) => Console.WriteLine("事件处理1");
btn.Clicked += (sender, args) => Console.WriteLine("事件处理2");
btn.Click();
// 按钮被按下
// 事件处理1
// 事件处理2