我在我正在使用的库的代码中遇到了这种模式。它在事件引发方法中设置状态,但仅在事件不为空时才设置。
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()
,但我认为这是一种黑客行为。
答案 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方法 上课确保注册 代表们会收到这个活动。