C# 委托与事件

委托与事件的基本区别

委托(Delegate)是类型安全的函数指针,允许将方法作为参数传递或存储。事件(Event)是基于委托的封装,提供更安全的发布-订阅模式。

委托示例代码:

csharp 复制代码
public delegate void MyDelegate(string message);

public class DelegateExample
{
    public static void DisplayMessage(string msg)
    {
        Console.WriteLine($"委托调用: {msg}");
    }

    public static void Main()
    {
        MyDelegate del = DisplayMessage;
        del("直接调用委托");
    }
}

事件示例代码:

csharp 复制代码
public class EventPublisher
{
    public event MyDelegate MessageEvent;

    public void TriggerEvent(string msg)
    {
        MessageEvent?.Invoke(msg);
    }
}

public class EventSubscriber
{
    public void OnMessageReceived(string msg)
    {
        Console.WriteLine($"事件触发: {msg}");
    }
}

public static void Main()
{
    var publisher = new EventPublisher();
    var subscriber = new EventSubscriber();

    publisher.MessageEvent += subscriber.OnMessageReceived;
    publisher.TriggerEvent("测试事件");
}

关键差异分析

  1. 封装性

    • 委托可直接通过=赋值或Invoke调用
    • 事件仅允许类内部触发(+=/-=操作符)
  2. 使用场景

    • 委托适用于回调机制和异步编程
    • 事件适用于观察者模式,如UI控件交互
  3. 线程安全

    事件默认包含线程安全调用:

    csharp 复制代码
    MessageEvent?.Invoke(msg);

    等效于:

    csharp 复制代码
    var handler = MessageEvent;
    if (handler != null) handler(msg);

设计选择建议

  • 需要外部触发操作时使用委托
  • 需要限制外部触发权限时使用事件
  • 事件本质上是通过add/remove访问器封装的委托

语法对比

特性 委托 事件
声明方式 public delegate void X public event X Y
外部调用 允许直接调用 仅允许+=/-=
空值检查 需手动检查 自动生成线程安全调用
相关推荐
520拼好饭被践踏18 分钟前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪29 分钟前
Java虚拟机:堆的参数配置
java·开发语言·jvm
冰暮流星35 分钟前
javascript之date对象
开发语言·javascript·ecmascript
Wang's Blog1 小时前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang
Ulyanov1 小时前
Python雷达电子对抗仿真引擎(一):打破单体瓶颈,构建微服务与ECS架构的顶层设计
开发语言·python·微服务·云原生·架构·雷达电子对抗
IT方大同1 小时前
C语言分支与循环语句
c语言·开发语言·算法
长不胖的路人甲2 小时前
斐波那契查找Java 实现 + 完整思路
java·开发语言
星恒随风2 小时前
C++ 继承进阶:默认成员函数、多继承、虚继承与组合设计
开发语言·c++·笔记·学习
Yeauty2 小时前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频
电子云与长程纠缠2 小时前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎