Зачем назначать обработчик событию перед его вызовом? - PullRequest
11 голосов
/ 28 февраля 2011

По сути, я видел, что это часто используется:

    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());
        }
    }

Итак, я что-то упускаю?Есть ли какая-то причина, по которой люди назначают событие обработчику, а затем поднимают обработчик вместо самого события?Это просто "лучшая практика"?

Ответы [ 2 ]

11 голосов
/ 28 февраля 2011

Присвоение локальной переменной гарантирует, что если событие будет незарегистрировано между if и фактическим вызовом, список вызовов не будет нулевым (поскольку переменная будет иметь копию оригинала список вызовов).

Это может легко произойти в многопоточном коде, где между проверкой на нулевое значение и запуском события оно может быть не зарегистрировано другим потоком.

См. этот ТАК вопрос и ответы.

2 голосов
/ 28 февраля 2011

Резьба безопасности.

Что произойдет, если между проверкой, если MyEvent имеет значение null, и запуском MyEvent, появится другой поток и откажется от подписки на событие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...