话不多说,先看代码:

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()方法前面