Проверки, если это не null, прежде чем стрелять из него в C#


Я часто вижу этого для пользовательских событий:

void InvokeCustomEvent(EventArgs e)
{
    var handler = CustomEvent;
    if (handler != null) handler(this, e);
}

Но создание переменной обработчика требуется, наилучшей практики, или избыточных, по сравнению с:

void InvokeCustomEvent(EventArgs e)
{
    if (CustomEvent != null) CustomEvent(this, e);
}

?



14735
8
c#
задан 3 марта 2011 в 11:03 Источник Поделиться
Комментарии
2 ответа


Но создание переменной обработчика требуется, наилучшей практики, или избыточных, по сравнению с:

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

Обычно у меня эта заява где-то в моем коде:

public static class EventExtensions
{
public static void Raise<T>(this EventHandler<T> handler, T args) {
if (handler != null) handler(args);
}
}

Сейчас, с любого обработчика событий, вы можете просто сделать:

handler.Raise(args);

Вы можете вызвать метод расширения с нулем , поэтому он будет делать правильные вещи, даже если обработчик является нулем. Кроме того, путем копирования обработчика в локальной переменной, используемой поднять, Вы автоматически получаете копию вам нужно убедиться, что обработчик не исчезают под вами. Работает как шарм.

15
ответ дан 3 марта 2011 в 11:03 Источник Поделиться

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

Объявите ваше мероприятие как так (Заметьте = делегат { } бит)

public event EventHandler CustomEvent = delegate { };

И затем вы можете вызвать его без каких-либо проверки.

8
ответ дан 3 марта 2011 в 11:03 Источник Поделиться