[c#初学者] 委托与事件的区别讨论
2026/4/16 2:24:34 网站建设 项目流程

文章目录

    • 概要
    • 委托与事件的概念
    • 委托的使用与风险
      • 委托的定义与调用
      • 委托的风险示例
    • 事件
      • 事件的使用
      • 事件的安全机制

概要

C# 中委托与事件是强大的工具 , 常用于事件通知方法调用中.
虽然对于概念和使用有所了解, 但在使用中经常混淆区别.
本文将结合代码实例, 简单的阐述二者开发中的区别

委托与事件的概念

委托(Delegate):C# 中的委托,可以用来引用方法, 可以存放一个或多个方法, 支持直接调用.
事件(Event):事件是基于委托的封装, 他限制了对委托的直接访问, 只允许特定的方式调用绑定的方法.
在功能上,事件增强了委托的安全性和稳定性,下面通过代码展示

委托的使用与风险

委托的定义与调用

publicdelegatevoidaDelegate(stringmessage);publicclassSetDelegate{publicaDelegatead;// 定义一个委托}publicclassProgram{publicvoidMain{SetDelegatesd=newSetDelegate();//绑定方法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{SetDelegatesd=newSetDelegate();//正常绑定方法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(){Alarmalarm=newAlarm();// 绑定事件处理器alarm.OnAlarm+=(msg)=>Console.WriteLine($"展示一个信息1:{msg}");alarm.OnAlarm+=(msg)=>Console.WriteLine($"展示一个信息2:{msg}");// 通过触发方法调用事件alarm.TriggerAlarm("明日不开战");}}

输出结果
展示一个信息1:明日不开战
展示一个信息2:明日不开战

事件的安全机制

  • 外部只可以通过 += -= 订阅或取消事件 , 无法直接调用Invock
  • 外部无法使用 = 覆盖事件逻辑, 避免了外部修改

委托与事件最大的区别在于对安全性的设计取舍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询