委托,事件(事件处理程序/事件监听器),概念(多播/广播),Action和Func
这将是一篇长文,但它是最简单的解释。这个主题很烦人的原因是因为人们只是用不同的词来解释同样的事情。
首先,你应该知道一些东西:
委托:它仅仅是一个方法列表,为什么要创建一个列表?因为当你的代码被执行时,该列表被提取并且其中的每个方法都会被一个接一个地执行,只需不听教科书上的定义,掌握这个,你就没问题了。
也称为:
- 函数指针
- 可以像变量一样发送和接收方法的方法包装器
要创建一个委托,你需要使用:
[[access modifier] delegate [return type] [delegate name]([parameters])]
example: public delegate int demo(int a);
现在要执行存储在名为delegate的列表中的所有方法,您可以继续。
1. demo.invoke(a);
2. demo(a); ..... both are valid
使用点号和显式调用在异步编程中很常见,你可以使用beginInvoke,但这超出了本主题的范围。
还有一件事叫做“创建委托对象/实例化委托”,它基本上就像它听起来的那样,但为了避免混淆,它是这样的(针对上面的示例)。
example : demo del = new demo(); (or) Public demo del = null;
要将任何方法添加到名为delegate的列表中,您需要使用+=,并且还需要在“方法要求满足”后将其删除,使用-=。
(方法的要求得到满足意味着您不再需要该方法处于活动状态或称为“侦听”)。如果您不删除它,可能会导致“内存泄漏”,这意味着您计算机的RAM将被耗尽,技术上分配的内存将不会释放。
例如:假设有一个方法。
public int calculate (int c)
to add this method to delegate you go
1. del = calculate;
2. del += calculate; .... all are valid
to remove
del -= calculate
首先请注意委托和方法之间的相似之处,返回类型(输出)和输入/参数是相同的,这是一个规则,您不能在委托中添加任何随意的或一堆方法,它需要遵循输入-输出规则。
现在为什么有两种不同的方式来做同一件事,唯一不同的是赋值运算符(+,=),这引入了一个新主题,称为事件。
事件只是委托的受限版本,仍然是一系列方法,不要因为人们解释这些术语而混淆,他们会更改名称,因此坚持使用这个术语来理解。
什么是约束?你不能这样做
del = calculate;
。有什么危害呢?假设一堆方法被添加到委托(列表)中,你这样做,所有方法都将被清除,只剩下一个方法“calculate”,所以为了防止这种情况,使用事件。
事件语法:
公共事件演示del = null;
还有一件事情,您不能像
demo.invoke
那样直接调用委托,因为它是公共的,可以访问和调用,但是对于事件,它不能。
现在,您只需将方法添加到事件(一种特殊类型的委托)即可。
何时使用事件和委托,取决于您的情况,但实际上事件很受欢迎。
更多关键词:
多播:只是将多个方法添加到委托中
广播:向事件添加多个方法
发布者:执行该方法的人(在广播中使用的术语),仅有一个实体
订阅者:正在执行的方法,可以是多个
监听器:与订阅者相同,但术语用于多播
事件处理程序:与订阅者/事件侦听器相同,那么有什么区别?基本上是相同的东西,有些人说事件侦听器检测事件发生,而事件处理程序“处理”或执行代码,它们在实践中是相同的!
Action和Func只是已创建并实例化的委托,因此在一个单词中有2行代码,区别仅在于返回类型
ACTION:不返回任何内容,但输入为0个或1个以上
FUNC:返回一个内容并带有参数
如果您不擅长阅读,这里是有关此主题的最佳视频
https://www.youtube.com/playlist?list=PLFt_AvWsXl0dliMtpZC8Qd_ru26785Ih_
事件(event)
是触发事件的事物,有其他东西可以订阅它。事件处理程序(EventHandler)
是处理事件的东西 - 即指定用于订阅事件的方法的对象。” - Matthew Watson