Я столкнулся с этим шаблоном в коде библиотеки, которую я использую. Он устанавливает состояние в методе возбуждения события, но только если событие не равно нулю.
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()
сам, но считаю, что это что-то вроде хака.