Снимок, содержащий значение обработчика события в качестве аргумента метода в C # - PullRequest
1 голос
/ 22 января 2012

Из этого вопроса других ) приведен пример создания снимка значения обработчика событий перед вызовом:

var tmp = _myEventHandler;
if(tmp != null) {
    tmp(sender, args);
}

Однако, если я передамОбработчик события и аргументы в функции это делает то же самое?

protected void Invoke(MyEventHandler handler, MyEventArgs args)
{
    if (handler != null)
        handler(this, args);
}

Я бы сказал, да, но подумав об этом, я не знаю, является ли это тем же - как может быть встроенный процесс оптимизацииэту функцию и снимать переменную снимок?

Ответы [ 2 ]

5 голосов
/ 22 января 2012

Это действительно делает то же самое. Код просто проверяет, что обработчик события не равен NULL и, следовательно, доступен для вызова. Этот код не отличается для поля / параметра / локального. Компилятор C # или JITer не может встроить это таким образом, чтобы временное удаление было удалено, потому что это изменило бы семантику программы.

0 голосов
/ 22 января 2012

Состояние гонки объясняется в других ваших ссылках, таких как Ответ Марка Гравелла .

Как указывает @JaredPar, ваш код фактически делает то же самое. Однако он нарушает стандартные соглашения о событиях для .NET, которые рекомендуют следующее:

protected virtual void OnAlarmRaised(AlarmRaisedEventArgs e)

Вы можете нарушать схему, но это идет вразрез с минимальной (если есть) выгодой.

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