c#编程,使用 事件 编程入门
在 C# 中,事件(Event) 是委托(Delegate)的封装,用于实现观察者模式(Observer Pattern)。
事件编程三要素
- 定义委托(约定事件签名)
- 声明事件(基于委托)
- 触发事件(在满足条件时调用)
示例:温度监控报警系统
场景:当现在的温度超过 阈值时,就触发事件通知
using System;
// 1. 定义自定义事件参数(传递数据),
// 这个是 当事件发生时候,要传递的参数, 这个类要继承 EventArgs,这里封装了当前温度属性(只读属性)
public class TemperatureChangedEventArgs : EventArgs
{
public double CurrentTemperature { get; }
public TemperatureChangedEventArgs(double temperature)
{
CurrentTemperature = temperature;
}
}
// 2. 定义事件发布者(Publisher)
public class TemperatureMonitor
{
// 3. 声明基于委托的事件(使用 EventHandler<T> 泛型)
public event EventHandler<TemperatureChangedEventArgs> OnTemperatureExceeded;
private double _threshold; //温度阈值
public TemperatureMonitor(double threshold)
{
_threshold = threshold;
}
public void UpdateTemperature(double newTemperature)
{
if (newTemperature > _threshold)
{
// 4. 触发事件(安全调用), 线程安全调用 实例化的委托
OnTemperatureExceeded?.Invoke(this, new TemperatureChangedEventArgs(newTemperature));
}
}
}
// 5. 定义事件订阅者(Subscriber)
public class AlertSystem
{
public AlertSystem(TemperatureMonitor monitor)
{
// 6. 订阅事件
monitor.OnTemperatureExceeded += HandleOverheat;
}
// 7. 事件处理方法(符合委托签名)
private void HandleOverheat(object sender, TemperatureChangedEventArgs e)
{
Console.WriteLine($"警报:温度超标!当前温度 {e.CurrentTemperature}°C");
}
}
// 使用示例
class Program
{
static void Main()
{
var monitor = new TemperatureMonitor(100); // 阈值设为100°C
var alert = new AlertSystem(monitor);
monitor.UpdateTemperature(99); // 不会触发
monitor.UpdateTemperature(105); // 触发事件,输出警报
}
}
关键点说明
-
事件参数(EventArgs)
- 继承
EventArgs
,用于传递事件相关数据(如温度值)。
- 继承
-
事件声明
- 使用
event
关键字,命名建议以On
开头(如OnTemperatureExceeded
)。
- 使用
-
事件触发
- 通过
?.Invoke()
安全调用(避免空引用异常)。
- 通过
-
订阅与取消
- 使用
+=
订阅事件,-=
取消订阅。
- 使用
-
线程安全
- 可在多线程场景中使用
lock
保护事件触发过程。
- 可在多线程场景中使用
输出结果
警报:温度超标!当前温度 105°C
典型应用场景
- 用户界面(如按钮点击事件)
- 异步操作完成通知
- 传感器数据实时监控
- 游戏中的状态变化(如角色血量归零)
通过事件机制,可以实现松耦合的代码结构,让发布者和订阅者独立演化。