Можно ли устанавливать состояние в методах повышения событий? - PullRequest
0 голосов
/ 24 марта 2010

Я столкнулся с этим шаблоном в коде библиотеки, которую я использую. Он устанавливает состояние в методе возбуждения события, но только если событие не равно нулю.

protected virtual void OnMyEvent(EventArgs e)
{
  if(MyEvent != null)
  {
     EnsureChildControls(); 
     MyEvent(this,e);
  }
}

Что означает, что состояние не устанавливается при переопределении метода:

protected override void OnMyEvent(EventArgs e)
{
   base.OnMyEvent(e);
   Debug.Assert( /* Child controls ensured */); // This fails
}

, но устанавливается только при обработке события:

foo.MyEvent += (o, args) => Debug.Assert(/* Child controls ensured */); // This passes

Установка состояния в if(MyEvent != null) кажется плохой формой, но я проверил Руководство по разработке событий , и в нем ничего не сказано.

Как вы думаете, этот код неверен? Если так, то почему? (Ссылка на рекомендации по проектированию будет полезна).

Изменить для контекста:

Это элемент управления, я пытаюсь создать его подкласс, и состояние, которое он устанавливает, вызывает EnsureChildControls() условно в зависимости от наличия обработчика события. Я могу позвонить EnsureChildControls() сам, но считаю, что это что-то вроде хака.

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

Я сомневаюсь, что вы найдете какие-либо указания на что-то вроде этого. Рекомендации, как правило, для очень распространенных случаев (что я бы не стал рассматривать это).

Относительно самой практики: я не вижу проблем с этим.

Для чего бы это ни стоило, вы можете избежать if(MyEvent != null), если используете это:

// initialize with empty delegate so MyEvent will never == null
public event MyEventHandler MyEvent = delegate {};
0 голосов
/ 11 мая 2010

Этот ответ содержит цитату MSDN, которая отвечает на мой вопрос:

Когда следует переопределять OnEvent вместо подписки на событие при наследовании

Также защищенный метод OnEventName позволяет производным классам переопределять событие без присоединения делегата к Это. Производный класс всегда должен вызывать метод OnEventName базы класс, чтобы убедиться, что зарегистрирован делегаты получают мероприятие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...