C#委托事件的区别

在C#中,委托(delegate)和事件(event)经常一起使用,但它们之间确实有一些基本的区别:

  1. 委托(Delegate):委托是一个引用类型,它可以引用一个或多个具有特定签名的方法。简单地说,你可以将其视为一个类型安全的函数指针。

  2. 事件(Event):事件基于委托来实现,但它添加了一层封装,使得对象的其他部分不能直接调用或修改事件,除非是那些声明了这个事件的类。事件通常用于在类之间通信,一个类可以发布一个事件,而其他类可以订阅这个事件。

示例代码

委托:

cs 复制代码
// 定义一个委托
public delegate void MyDelegate(string message);

public class MyClass
{
    // 使用委托
    public MyDelegate MyAction;

    public void TriggerAction()
    {
        MyAction?.Invoke("Triggered action!");
    }
}

public class Program
{
    public static void Main()
    {
        MyClass obj = new MyClass();
        obj.MyAction += DisplayMessage;
        obj.TriggerAction();
    }

    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}

事件:

cs 复制代码
public delegate void MyEventHandler(string message);

public class EventPublisher
{
    // 使用事件
    public event MyEventHandler MyEvent;

    public void RaiseEvent()
    {
        MyEvent?.Invoke("Event raised!");
    }
}

public class Program
{
    public static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.MyEvent += OnMyEventOccurred; // 订阅事件
        publisher.RaiseEvent();
    }

    static void OnMyEventOccurred(string message)
    {
        Console.WriteLine(message);
    }
}

注意:

  • 在委托的例子中,我们可以直接访问和修改MyAction委托。
  • 在事件的例子中,我们不能直接访问或修改MyEvent事件(例如,不能直接调用或设置为null),但我们可以使用+=订阅事件和使用-=取消订阅事件。

这样,事件提供了更好的封装和控制,使外部代码不能直接调用或修改事件,除非是那些声明了这个事件的类。

相关推荐
wuyk55516 分钟前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
君顾16 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠7 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
南棱笑笑生7 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
平头哥技术团队7 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++7 小时前
【洛谷】kmp算法
开发语言·算法
传奇开心果编程7 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743878 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
Draw Stars8 小时前
Git BASH安装教程
开发语言·git·bash
vortex58 小时前
一文讲透 Zsh 与 Bash 的区别
开发语言·bash