Фрагмент кода обработчика события - PullRequest
2 голосов
/ 27 мая 2011

Хотелось бы услышать мнения по фрагменту кода ниже.Есть что-нибудь, что можно улучшить?Называет ли обработчик событий / сборщик событий лучшие практики?Я знаю, что не так полезно обрабатывать и вызывать события в одном и том же классе, но это всего лишь фрагмент кода.

1 Ответ

6 голосов
/ 27 мая 2011

Основным изменением, которое я бы порекомендовал, было бы получить копию обработчика события:

// Event raiser
protected virtual void OnLogWritten(EventArgs e)
{
    var handler = this.LogWritten;
    if (handler != null)
    {
        handler(this, e);
    }
}

Это важно, если вы планируете (в конце концов) использовать этот класс в многопоточном сценарии. Таким образом, я считаю, что это хорошая «лучшая практика», чтобы привыкнуть к использованию. Проблема заключается в том, что при использовании в нескольких потоках без создания копии возможно, что единственный прикрепленный «обработчик» мог отписаться между нулевой проверкой и вызовом, что привело бы к ошибке времени выполнения. Копируя во временную переменную (var handler = this.LogWritten;) строку, вы фактически создаете «снимок» списка подписчиков и , затем проверяете его на ноль и вызываете, если требуется.

Другое изменение в самой декларации события. Вместо использования Action<T1,T2>:

// Event object
public event Action<object, EventArgs> LogWritten;

Я бы рекомендовал использовать EventHandler<TEventArgs> (если вы хотите использовать собственный подкласс EventArgs) или EventHandler (для стандарта EventArgs). Это более «стандартная практика», и ее ожидают другие разработчики:

// Event object
public event EventHandler LogWritten;
...