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

C# 知道设置了多少个EventHandler吗?,c#,events,event-handling,C#,Events,Event Handling,众所周知,我们可以创建一个EventHandler并多次向其添加方法。比如: // Declare and EventHandler public event EventHandler InternetConnectionAvailableEvent; private void OnInternetConnectionAvailableEvent() { if (InternetConnectionAvailableEvent != null

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

   // 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,所有其他方法也将被自动删除

我相信会的,但我只是想和各位专家确认一下。在谷歌搜索时,我没有得到满意的答案


如果我错了,请纠正我。

代理是通过相等方式删除的,因此您没有从调用列表中删除任何内容,因为调用列表中没有任何内容是
null
您所描述的是类似于字段的事件。除了没有正文外,它与直接事件声明相同

在类内部,可以将事件设置为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(只要您在声明事件的类中)。

或者也可以执行for循环和MyEvent-=handler方法(我们使用+=)对吗。并使MyEvent=null。这两个选项可以解决我的问题。我说得对吗。我与学员相处不好,在tiems时感到困惑。因此,我要求确认。通过将标识符
x
更改为
MyEvent