本文是学习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中通过互锁的方式提供了线程安全性