当前位置: 首页 > news >正文

【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,本文结束

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

相关文章:

  • leetcode hot100强化练习 0 - 35
  • 华为S5700交换机版本升级步骤
  • Android中ANR的分析和解决
  • SPWM载波调制方式-三电平杂记1
  • 渗透测试之Web安全系列教程(二)
  • 300价值与300成长指数
  • 【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理
  • 集成学习算法笔记
  • 已解决java.nio.charset.CoderMalfunctionError: 编码器故障错误的正确解决方法,亲测有效!!!
  • 有钱还系统源码,人人还众筹还钱模式还贷系统源码
  • SD-WAN简介
  • Android基础-UI布局
  • 正缘画像 api数据接口
  • 隐马尔可夫链
  • 【射击game】
  • [译]如何构建服务器端web组件,为何要构建?
  • canvas 绘制双线技巧
  • Druid 在有赞的实践
  • JavaScript服务器推送技术之 WebSocket
  • Java精华积累:初学者都应该搞懂的问题
  • Lsb图片隐写
  • sessionStorage和localStorage
  • vue--为什么data属性必须是一个函数
  • 力扣(LeetCode)965
  • 漂亮刷新控件-iOS
  • 山寨一个 Promise
  • 实现简单的正则表达式引擎
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​香农与信息论三大定律
  • #1015 : KMP算法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (ibm)Java 语言的 XPath API
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Java)【深基9.例1】选举学生会
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)springcloud实战之config配置中心
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (分布式缓存)Redis哨兵
  • (附源码)计算机毕业设计大学生兼职系统
  • (九)One-Wire总线-DS18B20
  • (十二)Flink Table API
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)原始图像数据和PDF中的图像数据
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .考试倒计时43天!来提分啦!
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心