话不多说,先看代码:
using System;
namespace ConsoleApp2
{
class Class21
{
public delegate void MethodCall();
public static event MethodCall MethodHandle;
static void Main(string[] args)
{
// 订阅事件
MethodHandle += Method;
// 只拷贝了一份事件当前的委托链,之后的更改和它无关
MethodCall call = MethodHandle;
MethodHandle += MethodA;
call();// 因此,只会调用第一个方法
//MethodHandle();直接调用事件,两个方法都会被调用
Console.Read();
}
public static void Method()
{
Console.WriteLine("调用了Method");
}
public static void MethodA()
{
Console.WriteLine("调用了MethodA");
}
}
}
在代码中,调用委托call()方法,只会调用Method方法。
原因是:
// 只拷贝了一份事件当前的委托链,之后的更改和它无关
MethodCall call = MethodHandle;
事件是一种特殊的委托,委托链是一个委托的集合,它允许我们调用这个集合中的委托所代表的所有方法。
如果想两个方法都被调用,有两种方式:
1. 把call()方法改成MethodHandle();直接调用事件
2. 或者是把MethodHandle += MethodA;写在call()方法前面