Зачем назначать обработчик событию перед его вызовом?
В основном, я видел, как это часто использовалось:
public event MyEventHandler MyEvent;
private void SomeFunction()
{
MyEventHandler handler = this.MyEvent;
if (handler != null)
{
handler(this, new MyEventArgs());
}
}
Когда это можно сделать так же легко:
public event MyEventHandler MyEvent;
private void SomeFunction()
{
if (MyEvent != null)
{
MyEvent(this, new MyEventArgs());
}
}
Итак, я что-то упускаю? Есть ли причина, по которой люди назначают событие обработчику, а затем поднимают обработчик вместо самого события? Это просто "лучшая практика"?
Ответы
Ответ 1
Назначение локальной переменной гарантирует, что если событие будет незарегистрировано между if
и фактическим вызовом, список вызовов не будет пустым (так как переменная будет иметь копию исходного списка вызовов).
Это может быть легко реализовано в многопоточном коде, где между проверкой нулевого и срабатыванием события он может быть незарегистрирован другим потоком.
См. этот вопрос и ответы.
Ответ 2
Безопасность резьбы.
Что произойдет, если между моментом, когда вы проверяете, является ли MyEvent нулевым, и вы запускаете MyEvent, появляется другой поток и отписывается от события?