之后就剩下两个了。每个-=
只删除一个订阅。至少,如果它仅使用常规委托来支持事件,情况就是如此。
您可以很容易地看到这一点,而无需真正涉及事件:
using System;
public class Program
{
public static void Main(string[] args)
{
Action action = () => Console.WriteLine("Foo");
// This is a stand-in for the event.
Action x = null;
x += action;
x += action;
x += action;
x -= action;
x(); // Prints Foo twice
}
}
严格来说,事件订阅可以做任何事情。您可以实现这样的事件:
private EventHandler weirdEvent;
public event EventHandler WeirdEvent
{
add { weirdEvent += value; } // Subscribe as normal
remove { weirdEvent = null; } // I'm bored with *all* the handlers
}
但通常事件只是委托给Delegate.Combine
and Delegate.Remove
,它们是 C# 中的语法糖的+=
方法-=
。
我关于事件和委托的文章包含有关组合和删除的确切情况的更多详细信息。