目录
[1. 系统默认事件:EventHandler](#1. 系统默认事件:EventHandler)
一、事件基础概念
事件依托委托实现 ,遵循发布 - 订阅设计模式:
- 发布方:类内部声明事件,满足业务条件时触发事件;
- 订阅方 :外部通过
+=绑定处理方法、-=取消订阅; - 关键特性:被
event修饰,不能直接用=赋值覆盖全部订阅,相比普通多播委托更安全。
1. 系统默认事件:EventHandler
.NET 内置EventHandler委托,固定签名void 方法(object sender, EventArgs e),适用于无自定义参数的事件。
cs
namespace _3事件
{
internal class Program
{
//语法:event + 委托类型 + 事件名称
public static event EventHandler MyClick;
static void Main(string[] args)
{
//绑定普通方法
MyClick += new EventHandler(F1);
//绑定Lambda表达式
MyClick += (sender, e) =>
{
Console.WriteLine("lambda表达式");
};
//触发执行事件
MyClick?.Invoke(null,null);
}
static void F1(object sender,EventArgs s)
{
Console.WriteLine("F1方法");
}
}
}
二、自定义参数事件实战:计算器加法完成事件
需求:计算器执行加法完毕后触发事件,订阅端获取两个加数与运算和。实现三步:自定义委托 → 基于委托定义事件 → 业务方法中安全触发事件
cs
namespace _4例子
{
//发布类:定义委托、事件、加法逻辑
public class Calc
{
//1.自定义委托,匹配事件处理方法参数格式
public delegate void AddDel(int a, int b, int sum);
//2.声明事件
public event AddDel Finished;
public void Add(int a,int b)
{
int sum = a + b;
//3.空安全触发事件:非空才调用
Finished?.Invoke(a,b,sum);
}
}
//订阅端
internal class Program
{
static void Main(string[] args)
{
Calc c = new Calc();
//订阅:+=绑定事件回调方法
c.Finished += F1;
c.Add(10, 20);
c.Add(30, 20);
}
//事件回调方法
static void F1(int a,int b,int c)
{
Console.WriteLine($"a的值为{a},b的值为{b},c的值为{c}");
}
}
}
三、知识点总结
- 事件 =
event+ 委托类型,是封装后的安全委托; - 绑定解绑:只能
+=订阅、-=退订,禁止外部=清空; - 两种事件写法:内置
EventHandler(固定参数)、自定义委托(自定义参数); - 触发规范:使用
事件名?.Invoke()做空判断,避免空引用异常。