//定义一个委托
//1.使用delegate关键字。
//2.这个委托将来要存储的方法如果没有返回值,那么委托也要定义成void。如果没有参数那么将来传递的方法也不能有参数
public delegate void MethodDelegate();
//委托是一个数据类型,用的时候需要传递一个变量。
//委托的作用就是:可以在某个代码内部,嵌入一段外部代码,相当于是注入
//一般在调用委托前或者是在触发事件前,要判断一下委托或者事件是否为null
Test(M1);
Console.ReadKey();
static void Test(MethodDelegate canshu)
{
canshu();
}
static void M1()
{
Console.WriteLine("这个是M1方法!");
}
通过遍历调用委托中的每个方法,实现获取每个方法的返回值;
通过调用GetInvocationList()方法,返回当前委托中的所有方法,返回值类型是Delegate数组。
所有定义的委托都是继承自抽象类MulticastDelegate,而MulticastDelegate继承自Delegate类(abstract)
多播委托:内部是将绑定在当前委托对象上的每个方法,都转换为一个委托对象,并且存储在一个叫_invocationList的object数组中,然后调用委托的时候,就循环遍历_invocationList数组,并且调用其中的每一个委托。
多播委托中只能存储同一类委托,如果其中某个方法执行时发生了异常,则后续的方法不再执行。
使用委托时,如果不是+=而是使用=赋值,会将前面绑定的所有其他方法(委托)都覆盖掉。
委托的作用:占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)
事件最终生成了:一个私有的委托;两个public的方法Add和Remove,分别用来实现事件的+=、-=。
有了委托类型后就可以定义事件了,因此使用事件和委托的区别是一个event关键字,委托是一个数据类型,事件相当于委托的一个变量