[c#初学者] 委托与事件的区别讨论
文章目录概要委托与事件的概念委托的使用与风险委托的定义与调用委托的风险示例事件事件的使用事件的安全机制概要C# 中委托与事件是强大的工具 , 常用于事件通知方法调用中.虽然对于概念和使用有所了解, 但在使用中经常混淆区别.本文将结合代码实例, 简单的阐述二者开发中的区别委托与事件的概念委托DelegateC# 中的委托,可以用来引用方法, 可以存放一个或多个方法, 支持直接调用.事件Event事件是基于委托的封装, 他限制了对委托的直接访问, 只允许特定的方式调用绑定的方法.在功能上,事件增强了委托的安全性和稳定性,下面通过代码展示委托的使用与风险委托的定义与调用publicdelegatevoidaDelegate(stringmessage);publicclassSetDelegate{publicaDelegatead;// 定义一个委托}publicclassProgram{publicvoidMain{SetDelegatesdnewSetDelegate();//绑定方法sd.ad(msg)Console.WriteLine($展示一个信息1{msg});sd.ad(msg)Console.WriteLine($展示一个信息2{msg});//调用方法sd.ad?.Invoke(明日不开战);}}输出结果展示一个信息1明日不开战展示一个信息2明日不开战委托本质上是一个方法列表 , Invoke 可以直接触发所有绑定方法公开的委托虽然易于调用, 但是在外部调用风险很大委托的风险示例开放的委托可能会导致外部代码修改内部逻辑publicdelegatevoidaDelegate(stringmessage);publicclassSetDelegate{publicaDelegatead;// 定义一个委托}publicclassProgram{publicvoidMain{SetDelegatesdnewSetDelegate();//正常绑定方法sd.ad(msg)Console.WriteLine($展示一个信息1{msg});sd.ad(msg)Console.WriteLine($展示一个信息2{msg});//正常触发sd.ad?.Invoke(明日不开战);//外部代码覆盖委托sd.ad(msg)Console.WriteLine($明日开战!);//再次触发sd.ad?.Invoke(明日不开战);}}输出结果展示一个信息1明日不开战展示一个信息2明日不开战明日开战!外部代码可以直接覆盖委托的绑定内容使用 操作符导致原有功能被破坏事件事件的使用事件是基于委托的封装, 限制了外部对委托的访问权限,从而增强安全性publicdelegatevoidAlarmHandler(stringmessage);publicclassAlarm{// 使用事件代替公开的委托publiceventAlarmHandlerOnAlarm;// 提供触发事件的方法publicvoidTriggerAlarm(stringmessage){OnAlarm?.Invoke(message);}}publicclassProgram{staticvoidMain(){AlarmalarmnewAlarm();// 绑定事件处理器alarm.OnAlarm(msg)Console.WriteLine($展示一个信息1{msg});alarm.OnAlarm(msg)Console.WriteLine($展示一个信息2{msg});// 通过触发方法调用事件alarm.TriggerAlarm(明日不开战);}}输出结果展示一个信息1:明日不开战展示一个信息2:明日不开战事件的安全机制外部只可以通过 - 订阅或取消事件 , 无法直接调用Invock外部无法使用 覆盖事件逻辑, 避免了外部修改委托与事件最大的区别在于对安全性的设计取舍。