在事件提升方法中设置状态是否可以?

时间:2010-03-24 18:42:45

标签: c# event-handling

我在我正在使用的库的代码中遇到了这种模式。它在事件引发方法中设置状态,但仅在事件不为空时才设置。

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)中设置状态似乎是不好的形式,但我检查了Event Design Guidelines并且没有提到这一点。

您认为此代码不正确吗?如果是这样,为什么? (参考设计指南会有所帮助)。

编辑上下文:

它是一个控件,我正在尝试创建它的子类,并且它设置的状态是基于事件处理程序有条件地调用EnsureChildControls()。我可以自己打EnsureChildControls(),但我认为这是一种黑客行为。

2 个答案:

答案 0 :(得分:3)

我怀疑你会找到类似这样的指导方针。指南通常用于非常常见的情况(我不会考虑这一点)。

关于练习本身:我认为这样做没有任何问题。

对于它的价值,如果你使用它,你可以避免if(MyEvent != null)

// initialize with empty delegate so MyEvent will never == null
public event MyEventHandler MyEvent = delegate {};

答案 1 :(得分:0)

这个答案提供了一个MSDN引用来回答我的问题:

When should you override OnEvent as opposed to subscribing to the event when inheritting

  

受保护的OnEventName方法也是   允许派生类重写   没有附加委托的事件   它。派生类必须始终调用   基础的OnEventName方法   上课确保注册   代表们会收到这个活动。