С# Знайте, сколько 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 раза и удаляется только один раз, сделав его нулевым, все остальные методы будут удалены автоматически.
Я считаю, что это будет, но я просто хотел подтвердить с вами экспертов. В то время как я не получил свой удовлетворительный ответ.
Пожалуйста, исправьте меня, если я ошибаюсь.
Ответы
Ответ 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 на события.