C#事件的本质

event字段本质就是对委托进行私有访问限制,事件的本质就是委托,只不过系统会对用event字段修饰的委托进行了特殊处理,比如自动生成一个私有的委托变量,添加两个事件访问器,同时禁止外部类对事件的Invoke等方法调用。

例如下面事件代码:

using System;

namespace AsyncDelegate
{
    public delegate void StateChangeHandler();
    public class EventTest
    {
        public event StateChangeHandler StatechangeEvent;
        public static void Method()
        {
            Console.WriteLine("事件触发~");
        }
        public static void Main(string[] args)
        {
            var eventTest = new EventTest();
            eventTest.StatechangeEvent += Method;
            eventTest.StatechangeEvent?.Invoke();
        }
    }
}

为了弄清event字段的作用,利用Ildasm.exe反汇编代码。

在这里插入图片描述

默认事件访问器的反汇编结果
  

发现系统自动添加了一个StateChangeHandler委托类型的私有变量StatechangeEvent,同时添加了两个方法add_StatechangeEvent、remove_StatechangeEvent.

这等同于下面的写法:

namespace AsyncDelegate
{
    public delegate void StateChangeHandler();
    public class EventTest
    {
        public event StateChangeHandler StatechangeEvent
        {
            add => _stateChangeHandler += value;
            remove => _stateChangeHandler -= value;
        }
        private StateChangeHandler _stateChangeHandler;
        public static void Method()
        {
            Console.WriteLine("事件触发~");
        }
        public static void Main(string[] args)
        {
            var eventTest = new EventTest();
            eventTest.StatechangeEvent += Method;
            eventTest._stateChangeHandler?.Invoke();
        }
    }
}

只是多了一个私有StateChangeHandler变量,以及一个事件访问器,其中add、remove方法里的value代指使用“+/-/+=/-=”委托运算符时对应的方法名。

其实,当你删除上面代码的event字段,你将会发现,代码依然可以运行。唯一区别就是现在事件可以在外部Invoke了罢了。

关于事件和委托的更多知识,可以参看我这篇文章:
🔗https://blog.csdn.net/weixin_44013533/article/details/134655722

本文就是它的截取。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cache【娓娓道来】

目录​​​​​​​ 1.自我介好😳😳😳 2.常用注解 💕💕💕 3.EnableCaching🤦‍♂️🤦‍♂️🤦‍♂️ 4.CachePut🤷‍♀️🤷‍♀️&#x1f93…

虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO创建VDO设备以节约硬盘空间 了解什么是VDO VDO全称是Virtual Data Optimize(虚拟数据优化),主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2,大小都是10G。file1和 f…

定时器的使用及实现

在Java中,定时器(Timer)是一个用于执行任务的工具类。它可以安排任务在指定的时间点执行,或者按照指定的时间间隔周期性地执行。 1. Timer类 Timer类位于java.util包中,它提供了一种简单而便利的方式来安排以后的任务…

AR + 通信,虚实结合让工作协同从线上到「现场」

在数字经济无所不在的当下,千行百业都与数智化办公接轨并因其实现转型升级。关注【融云 RongCloud】,了解协同办公平台更多干货。 升级的背后,是利用技术把工作用更自然的方式连接起来,让整个工作流协同更顺、体验更好。 而其中…

Dijkstra(迪杰斯特拉)算法

Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Ford 算法 如果想求任意两点之间的距离…

占用站点资源,无法正常登录?这个功能帮助解决

在企业里随着PDM用户的增加PDM管理员是否发现原本的站点已经不够用出现部分用户占用站点资源导致其他用户无法正常登录导致该问题无法解决,本篇介绍PDM自动下线的功能助力企业解决问题,更好的帮助企业完成PDM的正常使用 今天我给大家带来的就是SOLIDWOR…

外网的maven项目转移到内网操作的步骤

1、新起一个仓库路径testRep,idea 引用的maven里的setting.xml里仓库配置修改成刚才建的路径,目的把需要的jar全部下载到那个文件夹里 2、项目打压缩包,刚才仓库文件夹打压缩包,并复制到内网电脑 3、内网电脑idea引入项目 4、修改…

【重点】【矩阵】48. 旋转图像

题目 参考答案 法1&#xff1a;辅助矩阵 class Solution {public void rotate(int[][] matrix) {int n matrix.length;int[][] newMatrix new int[n][];for (int i 0;i < n; i) {newMatrix[i] matrix[i].clone();}for (int i 0; i < n; i) {for (int j 0; j <…

PD-1、BRAF和MEK联合抑制BRAFV600E结直肠癌癌症的2期试验

今天给同学们分享一篇文章“Combined PD-1, BRAF and MEK inhibition in BRAFV600E colorectal cancer: a phase 2 trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; MAPK抑制增强BRAF V600E CRC的免疫反应 作者之前在BRAF…

图的深度优先搜索(数据结构实训)

题目&#xff1a; 图的深度优先搜索 描述&#xff1a; 图的深度优先搜索类似于树的先根遍历&#xff0c;是树的先根遍历的推广。即从某个结点开始&#xff0c;先访问该结点&#xff0c;然后深度访问该结点的第一棵子树&#xff0c;依次为第二顶子树。如此进行下去&#xff0c;直…

彩色成像的基础和应用 原理 Principles(一)

下面我将不定期尽可能出一系列&#xff08;我觉的非常好&#xff09;翻译的文章来解释颜色这们学科。【下图为此次翻译的书籍封面】 Introduction: 颜色是一种与光的物理学&#xff0c;物质的化学&#xff0c;物体的几何特性以及人…

【【RGB LCD 彩条显示实验 ---1】】

RGB LCD 彩条显示实验 —1 TFT-LCD 的全称是 Thin Film Transistor-Liquid Crystal Display&#xff0c;即薄膜晶体管液晶显示屏&#xff0c;它显示的每个像素点都是由集成在液晶后面的薄膜晶体管独立驱动&#xff0c;因此 TFT-LCD 具有较高的响应速度以及较好的图像质量。 我…

基于JAVA+SpringBoot+微信小程序的宠物领养平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着人们生活水平的提…

Linux挂载配置本地yum源

1.vi /etc/yum.repos.d/redhat.repo 2. [baseos] namebaseos baseurlfile:///mnt/BaseOS #enabled:默认为1 enabled1 gpgcheck0 [appstream] nameappstream baseurlfile:///mnt/AppStream enabled1 gpgcheck0 3. mount /dev/sr0 /mnt/ 4.yum clean all 5.yum makecache

Java 简易版 UDP 多人聊天室

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

校园跑腿小程序源码系统 源码完全开源可二开,在线下单 附带完整的搭建教程

随着互联网的快速发展&#xff0c;人们的生活方式也在不断改变。特别是在校园内&#xff0c;由于学习、生活等各种原因&#xff0c;学生们需要处理许多琐碎的事情。而校园跑腿服务正是在这样的背景下应运而生&#xff0c;它能够为学生们提供便捷、快速、个性化的服务&#xff0…

LeetCode题:931下降路径最小和

目录 一、题目要求 二、解题思路 &#xff08;1&#xff09;状态表示 &#xff08;2&#xff09;状态转移方程 &#xff08;3&#xff09;初始化 &#xff08;4&#xff09;填表顺序 &#xff08;5&#xff09;返回值 三、代码 一、题目要求 931. 下降路径最小和 给你…

统信UOS_麒麟KYLINOS上使用WeekToDo

原文链接&#xff1a;统信UOS/麒麟KYLINOS上使用WeekToDo hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信UOS/麒麟KYLINOS上使用WeekToDo的介绍。在忙碌的工作和生活中&#xff0c;有效地管理时间和任务是非常重要的。WeekToDo作为一个免费和开源的每周计划器…

python实现pdf转word、word转pdf

我的博客 文章首发于公众号&#xff1a;小肖学数据分析 Python自动化办公通常对常用的办公软件文档格式进行操作&#xff0c;比如Word和PDF。 很多软件都需要付费&#xff0c;作为程序员&#xff0c;怎么可能付费。 下面是一个简单示例&#xff0c;如何在Python中将Word文档…

Java网络编程——非阻塞通信

对于用ServerSocket以及Socket编写的服务器程序和客户程序&#xff0c;它们在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时&#xff0c;假如没有客户连接&#xff0c;该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的…