Это очень подробное определение события.
Операторы +=
и -=
являются сокращением для Delegate.Combine
и Delegate.Remove
, плюс вы можете поставить методы доступа add
и remove
каждый на одной строке. Это избавит вас от необходимости набирать текст и несколько строк.
add { ErrorEvent += value; }
Поскольку вы не используете коллекцию обработчиков (например, свойство Events
в System.ComponentModel.Component
), в действительности нет необходимости реализовывать add
и remove
присоединяются самостоятельно.
Поле поддержки не должно быть protected
. Класс, реализующий событие, должен контролировать, как оно используется.
Каждое событие можно сократить до двух строк (три, если вы определяете тип делегата для каждого события, но вам не нужно это делать):
public event ErrorEventHandler Error;
protected virtual void OnError(object sender) => Error?.Invoke(sender);
Первая строка - это автоматически реализованное событие. Он создает частное вспомогательное поле для события, и все ссылки на событие в классе используют это поле напрямую. Он также создает элемент события publi c, который может использоваться потребителями для подписки на событие. Это включает в себя добавление / удаление логи c, идентичных имеющимся у вас.
Метод OnError
("On
" + имя события) позволяет производным классам вызывать событие, не используя поле поддержки. (так как это личное) и инкапсулирует логи проверки нуля c. Это protected virtual
, так что производные классы могут переопределить его и вставить logi c (например, ведение журнала) перед вызовом базовой реализации. Спасибо @Markus Safar за указание причины.