Улучшение событий - PullRequest
2 голосов
/ 15 января 2020

Я пытаюсь выяснить, сколько строк занимают наши обработчики событий. Каков наилучший способ интеграции add {} и remove {}, поэтому мне не нужно повторять его каждый раз, когда я создаю новое событие.

  public delegate void ErrorEventHandler(System.Object sender);
  protected ErrorEventHandler ErrorEvent;

  public event ErrorEventHandler Error
  {
     add
     {
        ErrorEvent = (ErrorEventHandler)System.Delegate.Combine(ErrorEvent, value);
     }
     remove
     {
        ErrorEvent = (ErrorEventHandler)System.Delegate.Remove(ErrorEvent, value);
     }
  }

Благодаря @ madreflection код выглядит сейчас

public delegate void ErrorEventHandler(System.Object sender);
public event ErrorEventHandler Error;
protected virtual void OnError(object sender) => Error?.Invoke(sender);

1 Ответ

3 голосов
/ 15 января 2020

Это очень подробное определение события.

Операторы += и -= являются сокращением для 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 за указание причины.

...