Зачем назначать обработчик событию перед его вызовом?

В основном, я видел, как это часто использовалось:

    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, появляется другой поток и отписывается от события?