委托与事件
理解委托的本质与作用
熟练使用内置泛型委托
掌握事件的标准实现与发布订阅模式
区分委托与事件的适用场景
核心讲解
(1)委托是什么
委托是方法的 “容器”,可以把方法当参数传递、赋值给变量,实现回调、方法传递。
本质:类型安全的方法指针
定义:
delegate 返回值类型 委托名(参数列表);调用:和调用普通方法一样
(2)内置泛型委托(推荐,不用自己定义)
表格
委托 | 说明 |
|---|---|
| 无参数,无返回值 |
| 1 个参数,无返回值 |
| 2 个参数,无返回值 |
| 无参数,有返回值 |
| 1 个参数,有返回值 |
| 1 个参数,返回 bool,判断用 |
(3)事件 event
事件是委托的封装,发布订阅模式,发布者触发事件,订阅者响应。
比普通委托安全:外部只能
+=/-=,不能直接调用、不能赋值标准实现:
event EventHandler 事件名;标准参数:
object sender(发送者)、EventArgs e(事件参数)
(4)使用场景
委托:需要传方法、回调、LINQ、异步
事件:解耦、发布订阅、通知机制,比如按钮点击、状态变化
操作步骤
编写委托示例,实现回调
编写事件发布订阅示例
运行验证调用流程
代码示例
// ===== 1. 委托示例 =====
// 内置委托
Action<string> print = s => Console.WriteLine("打印:" + s);
Func<int, int, int> add = (a, b) => a + b;
print("Hello 委托");
Console.WriteLine("加法委托:" + add(10, 20));
// 方法当参数
void DoWork(Action callback)
{
Console.WriteLine("开始工作...");
callback(); // 回调
Console.WriteLine("工作结束");
}
DoWork(() => Console.WriteLine("回调执行了"));
// ===== 2. 事件示例 =====
// 发布者:按钮
class Button
{
// 标准事件
public event EventHandler? Click;
public string Text { get; set; } = "";
public void OnClick()
{
// 触发事件
Click?.Invoke(this, EventArgs.Empty);
}
}
// 订阅者
class Form
{
public Button Btn = new Button { Text = "确定" };
public Form()
{
// 订阅事件
Btn.Click += Btn_Click;
}
private void Btn_Click(object? sender, EventArgs e)
{
Button btn = (Button)sender!;
Console.WriteLine($"按钮「{btn.Text}」被点击了");
}
}
// 测试
Form form = new Form();
form.Btn.OnClick(); // 触发点击
// 取消订阅
form.Btn.Click -= form.Btn_Click;
Console.ReadKey();
常见误区
委托和事件分不清:委托是类型,事件是成员;事件是封装的委托,更安全
事件外部直接调用:事件只能在类内部触发,外部只能订阅取消,这是事件的封装性
命名不规范:事件名用动词,处理方法名
对象_事件名乱用自定义委托:能用内置委托就用内置,99% 场景都覆盖,不用自己定义 delegate
课后练习
用
Func委托写一个方法,接收两个数字和一个计算委托,返回结果定义一个温度报警器类,温度超过阈值触发报警事件
编写订阅者,订阅报警事件,输出提示
说明委托和事件的区别,分别适合什么场景?

