委托和事件
- 委托在IL就是一个类
- 继承自System.MulticastDelegate 特殊类-不能被继承
委托声明
public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x, int y);//1 声明委托
public delegate int WithReturnNoPara();
public delegate MyDelegate WithReturnWithPara(out int x, ref int y);
委托就是一个类 为什么要用委托? 这个类的实例可以放入一个方法,实例Inovke时,就调用方法
唯一的差别,就是把方法放入了一个对象/变量
以后尽量统一使用Action/Func 因为是框架封装的
普通委托:(本身实例化的时候,参数都是一样的,都是id/name,但却是不同的类型,导致没法通用)
多播委托
-
多播委托有啥用呢?一个委托实例包含多个方法,可以通过+=/-=去增加/移除方法,Invoke时可以按顺序执行全部动作
-
任何一个委托都是多播委托类型的子类,可以通过+=去添加方法
-
+= 给委托的实例添加方法,会形成方法链,Invoke时,会按顺序执行系列方法
-
启动线程来完成计算 会报错,多播委托实例不能异步
-
-= 给委托的实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的,移除,且只移除一个,如果没有匹配,就啥事儿不发生
事件的声明
事件使用 event 修饰
委托是一个类型,事件是一个委托类型的特殊实例 。事件相对于委托来说是安全的,因为在定义了一个委托实例之后,其被执行的时候并不安全,由于其外部的类也可以调用类内部的委托的执行,而事件可以在外部去注册事件实现的方法,且只能在类的内部触发事件,所以事件是安全的
事件(观察者模式)能把固定动作和可变动作分开,完成固定动作,把可变动作分离出去,由外部控制
public event myDel myEvent