C# 事件(Event)详解:从委托到事件机制

C# 事件(Event)详解:从委托到事件机制
在学习 C# 的过程中事件Event是一个非常重要的知识点。很多初学者会发现委托Delegate已经可以调用方法了为什么还需要事件答案是委托负责“存储和调用方法”事件负责“安全地发布通知”。事件本质上是基于委托构建的一种更安全的消息通知机制。一、什么是事件简单理解事件就是一种特殊的委托用来表示“某件事情发生了”。比如手机收到短信 → 触发通知事件点击按钮 → 触发 Click 事件温度超过阈值 → 触发报警事件文件下载完成 → 触发完成事件生活中的例子订阅者 ← 关注 ← 事件 ← 发布者例如微信公众号公众号发布者 | | 发布文章 ↓ 粉丝订阅者粉丝不会修改公众号内部逻辑只会订阅消息。这就是事件设计思想。二、事件和委托的关系先看委托public delegate void MyDelegate();创建一个委托class Program { public delegate void MyDelegate(); static void Hello() { Console.WriteLine(Hello C#); } static void Main() { MyDelegate d Hello; d(); } }输出Hello C#委托可以保存方法调用方法但是委托有一个问题public MyDelegate MyEvent;外部代码可以obj.MyEvent null;甚至obj.MyEvent AnotherMethod;导致内部逻辑被破坏。所以 C# 引入了event 事件三、事件基本语法事件声明public event 委托类型 事件名;例如public delegate void MyDelegate(); class Test { public event MyDelegate MyEvent; }这里MyEvent就是一个事件。四、事件完整案例假设设计一个温度报警系统。1. 定义委托public delegate void TemperatureHandler();2. 创建发布者class TemperatureSensor { public event TemperatureHandler TemperatureChanged; public void CheckTemperature(int temperature) { if(temperature 30) { TemperatureChanged(); } } }这里TemperatureSensor负责检测温度触发事件它不知道谁监听。3. 创建订阅者class Alarm { public void Warning() { Console.WriteLine(温度过高请注意); } }4. 注册事件class Program { static void Main() { TemperatureSensor sensor new TemperatureSensor(); Alarm alarm new Alarm(); sensor.TemperatureChanged alarm.Warning; sensor.CheckTemperature(35); } }输出温度过高请注意流程CheckTemperature() | | ↓ TemperatureChanged事件触发 | | ↓ Alarm.Warning()五、 和 -事件订阅event 方法;取消订阅event - 方法;例如sensor.TemperatureChanged alarm.Warning; //取消 sensor.TemperatureChanged - alarm.Warning;六、事件为什么比委托安全看区别委托public MyDelegate Handler;外部obj.Handler null;可以修改。事件public event MyDelegate Handler;外部只能obj.Handler Method; obj.Handler - Method;不能obj.Handler null;所以event 限制了外部访问权限。七、事件标准写法推荐实际项目中不会这样public delegate void MyHandler(); public event MyHandler MyEvent;而使用EventHandler.NET 内置委托。格式public event EventHandler EventName;例如class FileDownloader { public event EventHandler DownloadCompleted; public void Download() { Console.WriteLine(正在下载...); DownloadCompleted?.Invoke(this,EventArgs.Empty); } }调用FileDownloader downloadernew FileDownloader(); downloader.DownloadCompleted Finish; downloader.Download(); static void Finish(object sender,EventArgs e) { Console.WriteLine(下载完成); }输出正在下载... 下载完成八、事件参数 EventArgs事件经常需要传递数据。例如温度报警当前温度是多少可以定义class TemperatureEventArgs:EventArgs { public int Temperature {get;set;} }事件public event EventHandlerTemperatureEventArgs TemperatureChanged;触发TemperatureChanged?.Invoke( this, new TemperatureEventArgs { Temperature35 });接收void Alarm(object sender, TemperatureEventArgs e) { Console.WriteLine( $当前温度:{e.Temperature}); }输出当前温度:35九、事件执行流程图发布者 | | 定义event事件 | | 触发事件 | | ---------------- | | 订阅者1 订阅者2 方法A 方法B一个事件可以有多个监听者event A; event B; event C;触发事件发生 ↓ A() ↓ B() ↓ C()十、事件常见应用场景1. WinForm按钮例如button.Click Button_Click;点击按钮Click事件触发2. WPF数据绑定PropertyChanged3. ASP.NET请求生命周期BeginRequest事件 ↓ EndRequest事件4. 游戏开发 Unity例如玩家死亡事件 ↓ UI更新 ↓ 播放动画 ↓ 保存数据十一、事件和委托区别总结特点委托事件本质方法引用特殊委托调用方法可以只能内部外部赋值可以不允许设计目的调用方法通知机制安全性低高使用场景回调消息通知十二、一句话总结委托是“我要调用谁”事件是“发生事情通知谁”。学习路线方法 ↓ 委托 Delegate ↓ Lambda表达式 ↓ 事件 Event ↓ 观察者模式 ↓ 异步编程对于零基础学习 C#事件是从基础语法进入面向对象设计思想的重要一步。掌握事件后你会真正理解 .NET 中大量框架机制按钮点击、生命周期、异步通知的底层原理。