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
外部调用 允许直接调用 仅允许+=/-=
空值检查 需手动检查 自动生成线程安全调用
相关推荐
死磕音视频2 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲5 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
曹牧5 小时前
C#:输入的字符串格式不正确
c#
程序喵大人7 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)7 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的7 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质8 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄6239 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_962885729 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python