Основным изменением, которое я бы порекомендовал, было бы получить копию обработчика события:
// 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;