Подтвердить что ты не робот

С# Знайте, сколько EventHandlers установлено?

Как мы все знаем, мы можем создать 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 раза и удаляется только один раз, сделав его нулевым, все остальные методы будут удалены автоматически.

Я считаю, что это будет, но я просто хотел подтвердить с вами экспертов. В то время как я не получил свой удовлетворительный ответ.

Пожалуйста, исправьте меня, если я ошибаюсь.

4b9b3361

Ответ 1

Чтобы найти количество обработчиков событий, вы можете использовать этот код:

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 (если вы в классе, объявившем событие).

Ответ 2

Делегаты удаляются с помощью равенства, поэтому вы не удаляете ничего из списка вызовов, потому что ничего в списке вызовов не будет null.

Ответ 3

То, что вы описываете, является полевым событием. Это то же самое, что и объявление longhand event, кроме тела.

Изнутри класса вы можете установить для события значение null. Из-за пределов класса вы не можете этого сделать. События следуют методике подписки и отписки. Внутри класса вы ссылаетесь на переменную, вне класса, с которым вы ссылаетесь.

Посмотрите на этот ответ Jon Skeet на события.