【C#】委托和事件

目录

1.概念

2.自定义的委托

3.系统定义的委托

4.委托和事件的区别


1.概念

数组我们都知道是一组数据的容器,而委托很相似,不过它是一组函数的容器。

如果把调用一次函数看做释放一个技能,那调用一次委托则是释放一套技能连招

下面看看我们应该如何使用委托

2.自定义的委托以及其用法

using System.Runtime.Intrinsics.Arm;namespace Delegate_Event
{//定义自定义委托//访问修饰默认不写为public在别的命名空间中也能使用//private其它命名空间就不能用了//一般使用public//声明一个无参数无返回值的委托容器public delegate void MyFun1();//声明一个有参数无返回值的委托容器public delegate void MyFun2(int val);//声明一个有参数有返回值的委托容器public delegate string MyFun3(int val);class Test{//用法一:在类中做参数MyFun1 fun1;MyFun2 fun2;//用法二:做参数public void TestFunc1(MyFun1 fun1, MyFun2 fun2){this.fun1 = fun1;this.fun2 = fun2;}//用法三:做返回值public MyFun1 TestFunc2(){return this.fun1;}}internal class Program{static void Main(string[] args){//委托容器只能装载与它声明时返回值和参数类型相同的函数//初始化方法一MyFun1 a1 = new MyFun1(Func1);MyFun2 b1= new MyFun2(Func2);MyFun3 c1 = new MyFun3(Func3);//初始化方法二MyFun1 a2 = Func1;MyFun2 b2 = Func2;MyFun3 c2 = Func3;//这时候我们只是创建好一些委托并初始化,但是还没有调用,因此控制台上看不到任何内容//调用方法如下//调用方法一a1.Invoke();b1.Invoke(1);c1.Invoke(2);//调用方法二a2();b2(11);c2(22);//之前在概念中我们提到,委托它是一组函数的集合,因此它应当能够添加更多的函数进来//添加或者删除函数方法如下a1 += Func1;b1 += Func2;c1 += Func3;//这时候a1,b1,c1里面都是存储了两个func函数,因此在调用一次它们时会调用两个对应函数//当然不是只能添加同一函数,只要参数和返回值类型相同的函数都可以添加a1 += Func11;//当委托里的一些函数我们不需要,需要删除函数时,方法如下a1 -= Func1;b1 -= Func2;c1-= Func3;//如果委托里的所有函数都不需要了,可以采用下面这样方法a2 = null;b2 = null;c2 = null;Console.WriteLine("------------------------");Test test = new Test();test.TestFunc1(Func1,Func2);test.TestFunc2();}static void Func1(){Console.WriteLine("无参数无返回值函数func1");}static void Func2(int a){Console.WriteLine("有参数{0}无返回值函数func2",a);}static string Func3(int a){Console.WriteLine("有参数{0}有返回值函数func3", a);return "我是Func3";}static void Func11(){Console.WriteLine("无参数无返回值函数func11");}}
}

3.系统定义的委托

像上面那种自定义委托,我们每需要一个新的委托类型时,就需要新声明一个委托类型,这样子不仅我们写起来很麻烦,而且当别人看我们写的代码时也会一头雾水——MyFun1到底是一个什么参数和返回值类型的委托?当我们看到很久以前自己写的代码,估计也会这样问。因此,接下来将介绍两种系统帮我们定义的委托类型

1.Action(无返回值类型)

参数可以根据需求选择添加,最多支持16个参数(一般用不到这么多),也就不足为虑尔

            //定义一个无参数无返回值类型的委托Action a;//定义一个有参数无返回值类型的委托Action<int> b;Action<int, string,int ,int> c;

2.Func(有返回值类型)

在传入的参数中,我们选择最后一个作为返回值类型,因此至少要传入一个参数

            //定义一个无参数有返回值类型的委托Func<int> d;//定义一个有参数有返回值类型的委托Action<int,int> e;Action<int, string, int, int> f;

4.委托和事件的区别

委托我们了解这么多了,那接下来该说说事件是什么,它们两个为什么会放在一起讲

事件其实就是特殊的委托

它特殊在哪里呢?且听我细细道来

首先声明方式不同:

        //声明委托Action a1;Func<int> b1;//声明事件event Action a2;event Func<int> b2;

需要在开头加上event

其次它们在使用上完全一致,没了

没了?????

怎么可能!!!!!!!!!!!

确实不可能,肯定还是有点略微的不同

1.事件不能在主函数中定义(它只能作为成员存在于类or接口or结构体中)

2.事件不能在类外部被赋值(+=和-=还是可以用滴)

3.事件不能在类外部被调用

ok,本文结束

博客得来终觉浅,绝知只能自己写,看完一定要动手敲一敲,不然等于没看。

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

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

相关文章

排序-希尔排序

介绍 希尔排序属于那种没有了解过的直接看代码一脸懵逼的&#xff0c; 所以同学们尽量不要直接看代码&#xff0c;仔细阅读本篇博客内容。 插入排序本来算是一个低效排序&#xff0c; 一次只可以挪动一个数据&#xff0c; 但是&#xff0c;它的强来了&#xff01;&#xff01…

网吧|基于SprinBoot+vue的网吧管理系统(源码+数据库+文档)

网吧管理系统 目录 基于SprinBootvue的网吧管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2 网管功能模块 3 会员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…

ASM OMF single-file creation form 重命名

OMF下不能自动命名&#xff0c;需要重新命名的话&#xff1a;1 1. spfile 可以 create pfile from spfile 后再create spfile from pfile 2 redo&#xff1f; 3 datafile&#xff1f; Here are some details of the copy problem: a) You are not allowed to set the numbe…

Arduino 按钮及弹跳

所需元件 可插入面包板的按钮1个 220Ω电阻1个 10kΩ电阻1个 3mm或5mm LED 1个 面包板1块 Arduino Uno开发板1块 面包板连接线数条 使用外接电阻 将5V接到按钮&#xff0c;按钮的另一端串联1个10kΩ电阻再接地&#xff0c;这样的接法被称为下拉电阻(pull-down resistor)。若测…

【30天精通Prometheus:一站式监控实战指南】第14天:jmx_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

【LeetCode算法】第104题:二叉树的最大深度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的先序遍历。首先判断根节点是否是空&#xff0c;其次判断根节点是否是叶子节点&#xff0c;再者递归获取左子树的深度、右子树的深度&#xff0c;最后返回左子…

【Mac】Lightroom Classic 2024(LrC 2024中文版) v13.1安装教程

软件介绍 Lightroom Classic 2024 for Mac是一款功能强大的照片编辑和组织软件&#xff0c;专为专业摄影师和爱好者设计。它提供了一系列工具和功能来增强和管理您的数码照片。Lightroom Classic 2024在照片组织和管理方面进行了重大改进。它新增了一个智能化的“发现”面板&a…

1. MySQL 数据库的基本操作

文章目录 【 1. SQL 的书写规则 】大小写规则常量的表示注释 【 2. RDBMS 术语 】Table 表Filed 域/字段Column 列Record 记录NULL 空值Constraint 约束数据的完整性范式 【 3. 数据库基本操作函数 】3.1 SHOW DATABASES 显示数据库3.2 CREATE DATABASE 创建数据库3.3 ALTER DA…

回炉重造java----JUC(第一天)

目录 JUC前置知识①进程和线程的区别&#xff1f;②并行和并发的区别&#xff1f;③异步调用和同步调用的区别&#xff1f;④创建线程的方法⑤线程的上下文切换⑥TimeUtil⑦Interrupt⑧如何在一个线程中终止另外一个线程&#xff1f;⑨线程的状态共享模型之管程 阻塞式&#x…

LLVM后端__llc中值定义信息的查询方法示例

关于LiveIntervals pass中相关数据结构的含义&#xff0c;在寄存器分配前置分析(5.1) - LiveInterval这篇博客中已经做了清晰的讲解&#xff0c;此处不再赘述&#xff0c;本文主要讲解值定义信息VNInfo的使用方法和注意事项。 1. VNInfo含义 在LLVM的源码中&#xff0c;VNInf…

视频汇聚EasyCVR综合安防平台对接GA/T1400公安视图库及应用方案

随着科技的不断进步&#xff0c;视频监控系统在公共安全领域发挥着越来越重要的作用。GA/T1400公安视图库作为公安视频图像信息应用系统的标准&#xff0c;为视频监控系统的对接提供了统一的规范和技术要求。 GA/T1400标准的应用范围广泛&#xff0c;涵盖了公安系统的视频图像信…

ASM+RAC spfile 恢复 改名

ASMCMD> cd DATA/CDB/PARAMETERFILE ASMCMD> ls spfile.290.1148481317 ASMCMD> rm -rf * ASMCMD> ls srvctl config database -db cdb 不用也可以 [oraclerac1 dbs]$ srvctl modify database -db cdb -spfile ----注释掉 [oraclerac1 dbs]$ srvctl modify da…

YOLOX源码之 wait_for_the_master

主进程读取数据 在函数 get_data_loader 中&#xff0c;下面这段代码的作用是在多节点分布式训练时&#xff0c;每个节点的主进程负责读取数据。 if self.dataset is None:with wait_for_the_master():assert cache_img is None, \"cache_img must be None if you didnt…

Python | A + B问题|||

if语句&#xff1a;if、elif、else 关系运算符 逻辑运算符&#xff1a;and&#xff08;&&&#xff09;、or&#xff08;||&#xff09;、not&#xff08;&#xff01;&#xff09; break退出循环 continue&#xff1a;只能出现在for、while循环内部&#xff0c;用法…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候&#xff0c;往往使用到数据并行&#xff0c;流水线并行&#xff0c;张量并行等技术&#xff0c;这些技术本质上也就是对数据进行各种方案的切分&#xff0c;然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…

秒杀基本功能开发(不考虑高并发情况)

文章目录 1.显示秒杀状态1.controller修改GoodsController.java的toDetail方法&#xff0c;响应秒杀状态和秒杀剩余时间 2.前端1.goodsDetail.html 图片下面添加一行秒杀开始时间2.goodsDetail.html 添加计时器js代码 3.测试1.秒杀进行中2.修改db的秒杀开始时间为明天3.出现秒杀…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本篇构建了这样的一个实例&#xff0c;可以动态修改UI的主题&#xff0c;通过菜单栏来选择预设的自定义主题和官方主题&#…

python列表的扩展操作

列表的扩展操作 zip() 函数 我们先学习 zip() 函数&#xff0c;将排名与分数挂钩。 还记得期中考试的顺序排名和分数吗&#xff1f;我们把排名放在了列表 midterm_rank 中&#xff0c;把分数放在了 scores 中。不过当时 scores 并没有排序&#xff0c;我们要对数据进行预处理…

深入理解文件系统和日志分析

文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;存储元信息&#xff08;包括文件的属性&#xff0c;权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block&#xff1a;块&#xff0c;连续…