C#委托与事件的区别

一、从定义来看:

**委托:**是一种类型,它定义了一种方法的签名(返回类型,参数类型,修饰符等),委托可以指向一个或者多个方法,并且可以像方法一样调用。

委托的定义类似于方法的声明,但是它本身不是方法,而是一个可以引用方法的类型

**事件:**事件是基于委托的,它是一种特殊的委托,用于订阅、发布模式。事件的目的是允许一个对象(发布者)在某些特定的情况下通知其他对象,事件本质上是一个委托对象,但它收到特殊的访问限制,只能由定义它的类来触发或者调用,而外部代码只能订阅或者取消订阅。

二、从使用场景来看:

委托: 主要用于实现回调机制,即一个方法调用另一个方法,而调用的具体方法可以在运行时动态指定(事件也能做到,只是委托更加合适);

委托也可以用于多播委托,即一个委托可以同时指向多个方法,调用委托时会依次调用这些方法

使用场景包括:1、回调函数 例如在异步操作完成后调用某个方法

2、多播委托 例如在一个操作完成后依次调用多个处理方法

事件: 主要用于实现对象之间的通信,特别是发布者和订阅者之间的解耦

典型使用场景包括:GUI编程中按钮点击事件,窗口关闭事件等

三、从访问限制来看:

**委托:**委托本身是一个普通的类型,可以被直接实例化,赋值和调用。

**事件:**事件是基于委托的,但它受到特殊的访问限制,事件只能由定义它的类来触发(调用),而外部代码只能+=或者-=操作符来订阅或者取消订阅。

四、从多播行为来看:

**委托:**支持多播,一个委托可以同时指向多个方法,调用委托时,会依次调用这些方法。

**事件:**事件本质上是一个委托,因此也支持多播,当事件被触发时,会依次调用所有的订阅方法。

总结:

**委托:**是一种类型,用于定义方法的签名,可以直接实例化,赋值和调用,主要用于实现回调机制和多播委托。

**事件:**是基于委托的,用于实现发布/订阅模式,只能由定义它的类触发,外部代码只能订阅或取消订阅,主要用于对象之间的解耦通信。

回调机制举例:

cs 复制代码
  public delegate void DownloadCallback(string data);
        static  void Main(string[] args)
        {

            DownloadCallback callback = ProcessDownloadedData;
            DownloadData(callback);
            Console.ReadLine();
        }

        public static void DownloadData(DownloadCallback callback)
        {
            // 模拟异步下载操作
            Thread.Sleep(2000); // 假设下载需要2秒

            // 下载完成后,调用回调方法
            string downloadedData = "Downloaded data";
            callback(downloadedData);
        }

        public static void ProcessDownloadedData(string data)
        {
            Console.WriteLine("Data received: " + data);
        }
相关推荐
SomeOtherTime13 分钟前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔23 分钟前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆44 分钟前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
Hvitur2 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J2 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪2 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂3 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫3 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
apcipot_rain7 小时前
C++转Java日记(06)
java·开发语言