前言:所有的名词,都是基于委托产生的
解释:
其实就是一种指定格式的函数模版(容器)
这个模版(容器)可以用来存放各种格式和它相同的函数(的引用)
比如指定类型参数 指定参数个数 指定返回值等等
定义:
public delegate void MyDelegate();
使用:
private MyDelegate m_DelegateAction; m_DelegateAction = Func1; m_DelegateAction?.invoke() m_DelegateAction += Func2; m_DelegateAction += Func3; m_DelegateAction?.invoke() m_DelegateAction -= Func2; m_DelegateAction -= Func3; m_DelegateAction?.invoke()
解释:
event是一种具有特殊签名的delegate
event的实现依赖于delegate
用在定义delegate对象时,在前部加上event签名
定义:
private event MyDelegate m_DelegateAction;
使用:
private MyDelegate m_DelegateAction; //在自身类中(声明 event 的类中):可以执行 = + - m_DelegateAction = Func1; m_DelegateAction?.invoke() m_DelegateAction += Func2; m_DelegateAction += Func3; m_DelegateAction?.invoke() m_DelegateAction -= Func2; m_DelegateAction -= Func3; m_DelegateAction?.invoke() //在其他类中:只能执行 + - m_DelegateAction += Func2; m_DelegateAction += Func3; m_DelegateAction?.invoke() m_DelegateAction -= Func2; m_DelegateAction -= Func3; m_DelegateAction?.invoke()与delegate的区别:
使用event签名的delegate对象,直接赋值(=)的操作会变成 private 权限
+= 和 -= 是重写变成了 add 和 remove 的方法,是 public 的,所以可以在外部调用
好处:
可以防止外部直接赋值导致所有的注册丢失,有一定的安全性
解释:
Action 就是一个 System 库自带的无even签名、’无返回值的委托
解释:
Func 就是一个 System 库自带的无even签名、具有泛型返回值的委托