在 C# 中**事件Event**是一种非常重要的机制它允许一个对象在状态发生变化时通知其他对象而无需知道这些对象的具体实现。事件广泛应用于 GUI 编程、系统通知、业务逻辑处理以及线程间通信等场景是实现观察者模式Observer Pattern的核心工具。本文将系统讲解 C# 事件的概念、使用方式并结合实例演示实际应用。事件的基本概念可以把事件理解为“信号”或“通知”通常由某个操作触发例如用户操作点击按钮、键盘输入、鼠标移动等系统操作定时器到期、中断触发、业务流程完成等事件机制允许发布者Publisher将事件通知给订阅者Subscriber订阅者在事件触发时执行相应的处理逻辑。C# 中事件和委托密不可分事件实际上是封装了委托的一种机制。事件的核心流程使用 C# 事件主要包括四个步骤声明委托委托定义了事件处理函数的签名。publicdelegatevoidNotifyEventHandler(objectsender,EventArgse);声明事件使用event关键字声明事件并指定委托类型。publiceventNotifyEventHandlerProcessCompleted;触发事件在合适的时机调用事件通知所有订阅者。protectedvirtualvoidOnProcessCompleted(EventArgse){ProcessCompleted?.Invoke(this,e);}订阅和取消订阅事件其他类通过和-运算符来订阅或取消订阅事件。process.ProcessCompletedProcess_ProcessCompleted;发布者与订阅者发布者Publisher包含事件和触发逻辑的类。当事件发生时它调用事件通知订阅者。订阅者Subscriber提供事件处理函数的类。订阅者注册事件后在事件触发时执行相应操作。这种模式称为发布-订阅模式Publisher-Subscriber Pattern。简单示例业务流程事件usingSystem;namespaceEventDemo{publicdelegatevoidNotifyEventHandler(objectsender,EventArgse);publicclassProcessBusinessLogic{publiceventNotifyEventHandlerProcessCompleted;protectedvirtualvoidOnProcessCompleted(EventArgse){ProcessCompleted?.Invoke(this,e);}publicvoidStartProcess(){Console.WriteLine(Process Started!);// 模拟业务逻辑OnProcessCompleted(EventArgs.Empty);}}publicclassEventSubscriber{publicvoidSubscribe(ProcessBusinessLogicprocess){process.ProcessCompletedProcess_ProcessCompleted;}privatevoidProcess_ProcessCompleted(objectsender,EventArgse){Console.WriteLine(Process Completed!);}}classProgram{staticvoidMain(){ProcessBusinessLogicprocessnewProcessBusinessLogic();EventSubscribersubscribernewEventSubscriber();subscriber.Subscribe(process);process.StartProcess();}}}运行结果Process Started! Process Completed!实战示例热水锅炉日志记录系统通过一个模拟热水锅炉的系统展示事件在实际业务中的应用usingSystem;usingSystem.IO;classBoiler{publicintTemp{get;privateset;}publicintPressure{get;privateset;}publicBoiler(inttemp,intpressure){Temptemp;Pressurepressure;}}classBoilerEventPublisher{publicdelegatevoidBoilerLogHandler(stringmessage);publiceventBoilerLogHandlerBoilerEventLog;publicvoidLogBoilerStatus(){BoilerboilernewBoiler(100,12);stringremarks(boiler.Temp80||boiler.Temp150||boiler.Pressure12||boiler.Pressure15)?Need Maintenance:O.K.;BoilerEventLog?.Invoke($Logging Info:\nTemperature:{boiler.Temp}\nPressure:{boiler.Pressure}\nMessage:{remarks});}}classBoilerLogger:IDisposable{privatereadonlyStreamWriter_writer;publicBoilerLogger(stringfilePath){_writernewStreamWriter(filePath,append:true);}publicvoidLogToFile(stringinfo)_writer.WriteLine(info);publicvoidDispose()_writer?.Close();}classProgram{staticvoidLoggerToConsole(stringinfo)Console.WriteLine(info);staticvoidMain(){usingvarfileLoggernewBoilerLogger(boiler.txt);varboilerEventnewBoilerEventPublisher();// 订阅事件boilerEvent.BoilerEventLogLoggerToConsole;boilerEvent.BoilerEventLogfileLogger.LogToFile;// 触发事件boilerEvent.LogBoilerStatus();}}运行效果Logging Info: Temperature: 100 Pressure: 12 Message: O.K.日志同时也写入boiler.txt文件实现事件驱动的多通道日志记录。使用事件的注意事项封装性外部类只能订阅或取消订阅事件不能直接触发事件保证发布者控制权。线程安全在多线程环境中触发事件使用?.Invoke或委托拷贝避免空引用或竞态条件。自定义事件参数当需要传递更多信息时可继承EventArgs创建自定义事件参数类而不仅仅使用EventArgs.Empty。总结C# 事件是封装了委托的通知机制非常适合实现发布-订阅模式。通过事件可以让对象在状态变化时通知多个订阅者实现业务逻辑解耦。使用事件的基本流程声明委托 → 声明事件 → 触发事件 → 订阅事件。事件不仅适用于 UI 操作还能用于后台业务逻辑、日志记录、线程通信等场景。掌握事件机制及注意事项你的 C# 程序将更加灵活、可扩展且易于维护。