C#知道设置了多少个EventHandler?

众所周知,我们可以创建一个EventHandler并向其添加N次方法。 喜欢:

// Declare and EventHandler public event EventHandler InternetConnectionAvailableEvent; private void OnInternetConnectionAvailableEvent() { if (InternetConnectionAvailableEvent != null) { EventHandler handle = InternetConnectionAvailableEvent; EventArgs e = EventArgs.Empty; handle(this, e); } } // IN OTHER CLASS WHERE I USE THE EVENT // Set the method name to handle the event monitorInternet.InternetConnectionAvailableEvent += HandleInternetConnectionEvent; void HandleInternetConnectionEvent(object sender, EventArgs e) { if (syncContext != null) { MonitorInternetConnection mic = (MonitorInternetConnection)sender; if (mic != null) { syncContext.Post(o => InternetConnected(), null); } } } // To remove monitorInternet.InternetConnectionAvailableEvent -= null; 

更新:

  // To remove it should be monitorInternet.InternetConnectionAvailableEvent -= HandleInternetConnectionEvent; // CORRECT 

可以多次调用相同的方法而不删除它。

如果我使monitorInternet.InternetConnectionAvailableEvent -= null; ,删除所有事件处理程序。 我的意思是如果它被设置2-3次,并且只删除一次,通过使其为null,也将自动删除所有其他方法。

我相信它会,但我只是想和你的专家确认一下。 谷歌搜索时,我没有得到我所要求的满意答案。

如果错了,请纠正我。

要查找事件处理程序的数量,您可以使用以下代码:

 InternetConnectionAvailableEvent.GetInvocationList().Length; 

以下代码演示了MyEvent -= null不会清除处理程序列表。

 public static event EventHandler MyEvent; [STAThread] static void Main() { MyEvent += (s,dea) => 1.ToString(); MyEvent -= null; Console.WriteLine(MyEvent.GetInvocationList().Length); // Prints 1 MyEvent = null; Console.WriteLine(MyEvent == null); // Prints true } 

要清除列表(这可能永远不是一个好主意),您可以将事件设置为null(只要您在声明事件的类中)。

通过相等性删除委托,因此您不会从调用列表中删除任何内容,因为调用列表中的任何内容都不为null

你所描述的是一个类似场的事件。 除了没有正文之外,它与简写事件声明相同。

从类内部,您可以将事件设置为null。 从课堂外你不能这样做。 事件遵循订阅和取消订阅方法。 在类中,您引用变量,在引用事件的类之外。

请参阅Jon Skeet关于事件的回答。