首页 > 编程语言 >C#的事件与委托

C#的事件与委托

时间:2024-02-05 20:47:49浏览次数:19  
标签:函数 委托 C# 事件 Func 返回值

本文是学习B站的up主:十月的寒流的学习笔记,推荐直接观看原视频:
C# 的委托与事件大致是怎么一回事

Action和Func是强类型委托,是dotnet为我们提供好的委托

Action是没有返回值的
Func是有返回值的

事件是一种特殊的委托

委托有什么用

  1. 将函数作为函数的参数进行传递
  2. 声明事件并注册
    强类型委托:
Action<T1>
Func<T1, T2>

事件有什么用

希望一个类的某些成员在发生变化时能够被外界观测到,例如:

  • CollectionChanged
  • TextChanged
    标准dotnet事件模型
delegate EventHandler(object sender, EventArgs e)

MulticastDelegate 多播委托

可以通过+=添加多个委托
private object? _invocationList;来存储多个委托或者一个委托
可以通过getInvocationList()来获得所有的delegate,他返回的是一个Delegate[]
注意事项:

  • 调用委托时,如果其中的一个委托报错,则后面的委托不会被调用
  • 只有最后一个委托的返回值,才会被当成委托的返回值
  • 因为多个委托是存在数组中的,当进行-=操作的时候,时间复杂度是O(n)的,逆序for循环查找移除项,并且重新创建移除后的list返回
  • 线程不安全的

委托为什么不等于函数指针:

  • 委托可以指向多个函数 +=多个
  • 委托可以指向同一个函数多次
  • 函数是包含在类中的,所以委托的函数引用也包含了函数所在对象的信息。而C/C++中的函数指针,只是函数的入口地址

事件说白了就是C#提供的语法糖,效果是:

  1. 将委托以私有变量的形式封装在类内,不让外面访问
  2. 对于委托进行了封装,从而定义add和remove方法
  3. 在add和remove中通过互锁的方式提供了线程安全性

标签:函数,委托,C#,事件,Func,返回值
From: https://www.cnblogs.com/xavierxiu/p/18008464

相关文章

  • CTT+CTS 游记
    游记写得比较混乱,都是流水账,大家可以当个乐子看看。NOIP把文件存在了桌面,喜提\(0\)分,参加不了省选了。于是,这就是我的最后一年了。CTT游记前面互测打得不错,所以还是比较有信心的。12.1到宾馆。室友是lcw。试机赛还是经典的三道题,半个小时就写完了。然后随便测了下速......
  • 视觉slam十四讲 ch3 三维刚体运动
    视觉slam十四讲---CH3三维刚体运动三维刚体运动,即三维空间下的刚体的运动。刚体,是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。在运动过程中,机器人或者飞机和汽车的形变很小,可以近似看作刚体。三维刚体运动就是研究如何描述和表示一个刚体在......
  • sc2 天梯地图
    没记错的话以前7张ban3张,非常合理,现在9张怎么还是ban3张好哥哥达蒙星际2教学Goldenauraban三四矿近,挂运输机的地方长,架坦克的点位多,ZvT打不了一点Equilibriumban莫名其妙Hecate不敲岩石的话中间的路很窄偏大,没有瞭望塔,难以控图(注意偷矿,多线)主矿下面、二三......
  • React中的错误边界处理是指的哪些?
    React中的错误边界处理是指的哪些?在React中,错误边界(ErrorBoundaries)是一种React组件,它能够捕获并处理其子组件树任何位置上抛出的JavaScript错误,并且阻止这些错误导致整个应用崩溃。当一个错误边界内的子组件发生渲染错误、生命周期方法中的错误或其他同步错误时,错误边界会捕获......
  • docker设置国内镜像源
    一、国内加速地址1、阿里云镜像站:(需登录,免费)https://<your_code>.mirror.aliyuncs.com2、网易云镜像站:http://hub-mirror.c.163.com3、百度云镜像站:https://mirror.baidubce.com4、上海交大镜像站:https://docker.mirrors.sjtug.sjtu.edu.cn5、南京大学镜像站:https://doc......
  • PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框
    PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框架。PowerShell提供了丰富的命令(称为cmdlet),可以用来执行许多Windows管理任务,包括但不限于用户和组管理、文件系统操作、进程和服务管理等。下面列举一些常见的net命令以及它们在PowerShell中的对......
  • 3.C语言学习--分支与循环例题分析2
    1.有三个数,将他们按照从大到小的顺序输出intmain(){ inta=0; intb=0; intc=0; scanf("%d%d%d",&a,&b,&c); inttmp=0; if(a<b) { tmp=a; a=b; b=tmp; } if(a<c) { tmp=a; a=c; c=tmp; } if(b<c)......
  • 执行truncate时报错:ORA-00054:资源正忙但指定以NOWAIT 方式获取资源或者超时失效,怎样
    在执行TRUNCATE语句时出现错误,可能是由于以下原因之一:表正在被其他会话使用:如果表正在被其他会话使用,您将无法执行TRUNCATE操作。请确保没有其他会话正在使用该表,并尝试再次执行TRUNCATE。权限不足:如果您没有足够的权限来执行TRUNCATE操作,则会收到错误消息。请确保您具有足......
  • neteq的peak detector解析
    neteq中的峰值检测原理如下:a)当interval_arrival_iat_packet超过target_level+2||interval_arrival_iat_packet>2*target_level的时候,认为这是一个峰值点b)记录该峰值点的高度(iat_packet)和该峰值点离上一个峰值点的间隔(period),然后放入记录数组boolDelayPe......
  • 关于CV_CAP_PROP_FRAME_WIDTH问题的解决
    关于CV_CAP_PROP_FRAME_WIDTH问题的解决此问题是OpenCV升级至4.x版本,对之前的写法不兼容的问题。解决方法是将CV删掉,即:CV_CAP_PROP_FRAME_WIDTH改为CAP_PROP_FRAME_WIDTH同样的,第二个报错的CV_CAP_PROP_FRAME_HEIGHT改为CAP_PROP_FRAME_HEIGHT按这个方式改正后,问题就得......