C# 委托/事件本质详解

委托

一.什么是委托

IL层面

1>委托的本质就是一个类

2>继承自System.MulticastDelegate

3>委托里面内置了3个方法:Invoke(),BeginInvoke(),EndInvoke()

二.委托的三个步骤

1>public delegate void MyDelegate();//1.委托的声明

2>MyDelegate myDelegate = new MyDelegate(DoSomething);//2.委托的实例化(构造函数传方法)

3>myDelegate.Invoke();//3.实例调用(Invok调用),这里等于执行了这个方法

myDelegate();//3.直接调用也和上面一行代码是一样的

三.委托的3大意义

1>解耦:

-好处是减少重复代码;

-解耦是解除了判断逻辑和共用逻辑之间的耦合;

-委托传递的是逻辑(逻辑就是方法);

2>异步多线程

3>多播委托

-+=为委托实例按顺序增加方法,形成方法链,Invok()时按顺序执行

--=为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的移除,且只移除一个;没有的也不异常

-多播委托带返回值,结果以最后的为准

-价值:一个变量保存多个方法,可以增减方法;Invok时候可顺序执行

事件

一.什么是事件

1>说白了,就是带event关键字的委托实例

2>事件可以限制变量外部调用,或者直接赋值

3>事件可以把一堆的动作或行为,封装出去,交给第三方指定

4>程序设计时候:

-固定部分,可以写死

-不固定部分,通过一个事件去开放接口,外部可以扩展动作

二.委托和事件的区别和联系

1>委托是一个类型,一个类,事件是委托的实例

2>比如委托时一个Student类,事件是“小明”实例