本文是学习B站的up主:十月的寒流的学习笔记,推荐直接观看原视频:
C# 的委托与事件大致是怎么一回事
Action和Func是强类型委托,是dotnet为我们提供好的委托
Action是没有返回值的
Func是有返回值的
事件是一种特殊的委托
委托有什么用
- 将函数作为函数的参数进行传递
- 声明事件并注册
强类型委托:
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#提供的语法糖,效果是:
- 将委托以私有变量的形式封装在类内,不让外面访问
- 对于委托进行了封装,从而定义add和remove方法
- 在add和remove中通过互锁的方式提供了线程安全性