Z
ZHANK
编程在线教程C# 教程委托、事件与 Lambda
高级特性

委托、事件与 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