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),但我们可以使用+=订阅事件和使用-=取消订阅事件。

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

相关推荐
leisoo8097几秒前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
霸道流氓气质4 分钟前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
weixin_4196583119 分钟前
CANoe 使用指南:从输出窗口到数据回放的完整实战教程
开发语言·功能测试·车载系统·自动化·汽车
当青春邂逅吉米多维奇20 分钟前
C#图解教程(第5版) 同步方法
开发语言·c#
骇客野人28 分钟前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质31 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
波力海苔夹心脆67536 分钟前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
外收内放1 小时前
Python基础语法练习题(62原始版本及其优化版本)
开发语言·python
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板