C# 事件和委托的区别并说明

news2024/9/29 21:29:50

1.区别

事件是基于委托的,为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托,他的调用和委托是一样的。

事件的声明
public event 委托类型 事件名称

通常事件的命名以事件名称+Event来命名。如public event delegate NotifyEvent;

事件和委托的区别如下:

事件只能在方法的外部进行声明,而委在方法的外部和内部都可以声明。

事件只能在类的内部触发,不能在类的外部触发。而委托在类的内部和外都都可以触发。

委托一般用于回调,而事件用于外部接口。例如在观察者模式中,在被观察者中可以声明一个事件作为外部观察者注册的接口。

同时,这个事件只能在被观察者内部触发,而观察者中无法触发该事件,从而保证了安全性。


 

委托和事件的定义 💬

委托

在这里再说一遍委托跟事件的简单定义(没有搜到特别准确的,都是大概定义,理解万岁)

委托:delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

委托是一种动态调用方法的类型,属于引用型。

委托是对方法的抽象和封装。委托对象实质上代表了方法的引用(即内存地址)

委托允许将方法作为参数进行传递。

委托可用于定义回调方法。

委托可以把多个方法链接在一起。这样,在事件触发时可同时启动多个事件处理程序。

委托签名不需要与方法精确匹配。

事件

事件:事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。

如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。

事件表示C#中已定义的一个对象,即处理通知过程的对象

通常,每个事件的发生都会产生发送方和接收方。在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法

委托和事件的区别

简单说了一下两者的定义,眼神好的小伙伴这时候就会发现,事件的说明里有提到一句话:“事件也可以算一种特殊的委托”,这句话不是特别准确,但是也不妨可以这样理解。

正因为如此,所以要我们先了解了 委托 再来看 事件 ,容易混淆大家的地方大多在于这两者之间的区别,下面说一下委托和事件之间的区别:

委托和事件的区别如下:

举例说明

我们将创建两个类ClassA和ClassB,这两个类都很简单,只有一个方法,并且这两个类的方法签名一样。ClassC内有委托和事件,为了演示方便,我们将委托和事件的访问权限都设为public。下面我们将主要看看委托和事件在使用上面的区别。

Class1

public class Class1
{
    //声明委托
    public delegate void NumberChanger(int n);
    //声明事件
    public static event NumberChanger changer;

    public static void test()
    {
        changer(100);
    }
    static void Main(string[] args)
    {
        Class1.changer += Class2.ClassA_Test;
        Class1.changer += Class3.ClassA_Test;
        Class1.test();
    }
}

Class2

    class Class2
    {
        public static void ClassA_Test(int i)
        {
            Console.WriteLine("Class2:"+i);
        }
    }

Class3

    class Class3
    {
        public static void ClassA_Test(int i)
        {
            Console.WriteLine("Class3:"+i);
        }
    }

区别一:是否是一个类型

    class Class3
    {
    static void Main(string[] args)
    {
        //委托正确使用
        Class1.NumberChanger n1 = Class2.ClassA_Test;
        //事件使用 编译器报错
        Class1.changer handle2 = Class2.ClassA_Test;
    }

错误:Class1.changer 是“字段”,但此处被当做“类型”来使用

区别二:委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用。

(1)在类外部调用委托

(2)在类外部调用事件

事件“ClassC.Say_EventHandler”只能出现在 += 或 -= 的左边(从类型“ClassC”中使用时除外)

区别三:委托可以在外部类使用 = 来赋值,事件只能在内部类用 = 赋值,外部类不可以

从编译器提示的错误,我们可以了解到,事件只能在声明它的类内部被调用。从事件本身来讲,事件一般用于类自身的属性变化时,用来通知外界自身的变化的。我们将对ClassC内部的一个属性赋值,然后调用事件,模拟对外通知。代码如下所示

总结 🏠

事件的使用方式跟委托没什么区别,事件就相当于一个加了"event"修饰符的委托,在加了这个修饰以后,委托的部分功能就相当于被阉割了。通过这个加了修饰符以后,我们可以更好的控制注册和注销,对于一个外部类来说,它就只能通过"+=/-="注册自己和注销自己,而且外界也不能主动触发一个事件。

委托一般用于回调,而事件用于外部接口。例如在观察者模式中,在被观察者中可以声明一个事件作为外部观察者注册的接口。

同时,这个事件只能在被观察者内部触发,而观察者中无法触发该事件,从而保证了安全性。

说了这么多,总结起来就一句话:事件与委托最主要的区别应该是不能在外部调用,但可以通过+=或-=进行注册,但如果委托变量为私有,则外部不能注册;如果为公有,则外部有可以调用,破坏了封装,所以没办法,在这种情况就定义一个event就好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Primer Plus 第二章习题

目录 复习题 1.C程序的模块叫什么? 2.#include 预处理器编译指令的用处? 3.using namespace std; 该语句是干什么用的? 4.什么语句可以打印一个语句"hello,world",然后重新换行? 5.什么语句可以用来创…

桂院校园导航 导入 与 配置教程

将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下(比如 D:\WeChatProjects),强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能(首月免费,次月19.9)&am…

【论文阅读笔记】CRFL: Certifiably Robust Federated Learning against Backdoor Attacks

个人阅读笔记,如有错误欢迎指出! 会议:PMLR 2021[2106.08283] CRFL: Certifiably Robust Federated Learning against Backdoor Attacks (arxiv.org) 问题: 现有的防御算法缺乏健壮性 创新: 证明了所提出框架得稳定性 通过马尔…

Generative AI 新世界 | 走进文生图(Text-to-Image)领域

在之前的四篇 “Generative AI 新世界” 中,我们带领大家一起探索了生成式 AI(Generative AI),以及大型语言模型(LLMs)的全新世界概览。并在文本生成(Text Generation)领域做了一些概…

javascript基础十:说说你对Javascript中this对象的理解

一、定义 函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定) this 关键字是函数运行时自动生成的一…

进程控制与进程调度 —— 时间片轮转调度算法(C++版)

目录 实验一 进程控制与进程调度 一、实验目的 二、实验内容 三、数据结构及符号说明 四、运行环境说明 五、代码段 六、 效果展示 实验一 进程控制与进程调度 备注:大二(下)操作系统实验一 一、实验目的 掌握进程状态的转变、…

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit java.awt.Toolkit.getDefaultToolkit()import java.awt.Toolkit;public class 多次调用Toolkit的getDefaultToolkit方法获得是同一个单例的Toolkit {static public void main (String...arguments)t…

WMS:系统窗口添加过程

WMS:系统窗口添加过程 1、经常使用的两大类窗口2、系统窗口StatusBar2.1 StatusBarWindowView添加流程2.2 简要时序图 android12-release 1、经常使用的两大类窗口 Android中的“窗口”类型有很多,经常使用的“窗口”大致分为两大类:一是,由系…

对于后端Linux的入门知识

为什么使用Linux 文章来自https://librehunt.org/,在这个网站里,你可以根据它提供的选项,最终选出适合你的Linux版本 It’s safe and private. No tracking. No company watching over you, no “big brother is watching you” nonsense. Ju…

article-三自由度机械臂运动学分析+仿真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOmeEm3I-1685366971102)(data:image/svgxml;utf8, )] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCu0JrBB-1685366971103)(data:image/svgxml;utf8, )] 建立坐标系 1…

ROS:创建工作空间和编译功能包

目录 一、工作空间二、创建工作空间三、编译空代码的工作空间四、功能包五、创建功能包六、设置和检查环境变量七、功能包中的两个重要文件 一、工作空间 存放工程开发相关文件的文件夹。类似一个IDE(例如Pycharm)新建一个工程,就是一个工作…

权威认可!腾讯云EdgeOne入选Gartner® DDoS缓解方案市场指南

近日,Gartner发布《Market Guide for DDoS Mitigation Solutions》报告,腾讯云EdgeOne入选Gartner DDoS缓解方案市场指南。 “分布式拒绝服务(DDoS)缓解市场包括检测和缓解DDoS攻击并将其作为专用产品提供的供应商。它包括专业供…

有这个证书,网络安全工程师找工作不用愁

想要成为网络安全工程师,满足企业的用人要求。最基本的,你需要熟悉TCP/IP协议,熟悉sql注入原理和手工检测、熟悉内存缓冲区溢出原理和防范措施、熟悉信息存储和传输安全、熟悉数据包结构、熟悉Ddos攻击类型和原理。并且有一定的ddos攻防经验&…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路,配置为开漏输出,所有设备输出低电平不输出高电平,即右图。又为了避免高电平造成的引浮空,(第三点)总…

kotlin用CoroutineScope启动协程async等待结果返回

kotlin用CoroutineScope启动协程async等待结果返回 例如: import kotlinx.coroutines.*object MyCoroutineScope {private val coroutineContext Job() Dispatchers.Default CoroutineName("my_context")val coroutineScope CoroutineScope(corouti…

【Redis】聊一下Redis数据同步/复制

在分布式系统中,基本上所有的存储中间件都支持数据同步/复制功能,主要的原因是为实现高可用,单点宕机的故障,必须需要将数据进行共享,而共享的话,就需要将数据进行复制,对于已经学过的MySQL和Ka…

Jdk17中文在线手册(建议收藏)

本身学习技术就比较难,再来一个英文版的API,就难上加难,经过几周的研究翻译,JDK17最新版中文在线手册搞定,不要看错了哈是JDK17不是JDK1.7,全网最新的只有JDK11,JDK17中文在线手册是第一次出现&…

JavaEE进阶(5/29)SpringMVC

目录 1.复习 2.URL传参PathVariable 3.上传文件RequestPart 4.获取Cookie/Session/header 5.传统/维新获取cookies 6.传统/维信获得Header 7.获取Session(非常重要) 8.不加ResponseBody 9.如何获取Json数据,RequestBody 10.想…

王者之力,驭见未来 | 圣戈班量子膜全国核心店面大会圆满落幕!

5月24日,“王者之力,驭见未来”——2023年圣戈班量子膜全国核心店面大会在成都缇沃丽酒店隆重召开! 圣戈班舒热佳特殊镀膜有限公司全球总裁Mehrotra Vishal先生、圣戈班舒热佳特殊镀膜有限公司亚太总裁陈剑超先生、圣戈班舒热佳特殊镀膜有限公…

opencv_c++学习(二十九)

一、监督学习的聚类方法 K近邻的方法: 首先给出一个阈值k,后寻找距离黑色圆点最近的k个元素,占据比例大的元素即为黑色所属的类别。如图所示,即k3时,黑色圆属于三角形,k5时圆点属于正方形。 支持向量机方…