Учебник по событиям в Microsoft показывает, как проверить event
для null
перед его запуском:
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
{ // Potential Race-condition at this point!
Changed(this, e);
}
}
Но это оставляет открытым состояние гонки, как описано в блоге Эрика Липперта, где он пишет, что события должны запускаться через локальное событие, чтобы избежать гоночного состояния:
protected virtual void OnChanged(EventArgs e)
{
ChangedEventHandler temp = Changed; // Local copy of the EventHandler
if (temp != null)
{ // Race condition avoided by local variable.
temp(this, e);
}
}
В то время как это работает, это сбило с толку многих разработчиков, которые ошибаются, и не помещают его в локальное событие.
Другим решением от DailyCoding является всегда инициализировать ваше событие, чтобы иметь один пустой обработчик, поэтому нулевой чек никогда не нужен:
// Set with empty delegate, will never be null
public event ChangedEventHandler Changed = delegate { };
protected virtual void OnChanged(EventArgs e)
{
// Neither Null-check nor local variable is needed; just trigger the event.
Changed(this, e);
}
Это имеет большой смысл и довольно просто.
Однако, так как я вижу, что этот метод так редко упоминается в Интернете, я думаю, что должна быть причина, почему.
Есть ли недостаток в инициализации события с пустым делегатом, подобным этому?