覆盖页面级事件时调用基本方法

时间:2020-03-05 18:41:22  来源:igfitidea点击:

在后面的代码中,我将事件连接起来,如下所示:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

我这样做是因为我在示例中已经看到了。

  • 是否需要调用base.OnInit()方法?
  • 会被隐式调用吗?
  • 最好在方法的开头或者结尾处调用它?
  • 如果对基本方法的困惑会给我们带来麻烦,这将是一个例子?

解决方案

回答

在这种情况下,如果我们不调用基本的OnInit,则Init甚至不会触发。

通常,除非我们特别知道我们不希望发生基本行为,否则最佳做法是始终调用基本方法。

在开始还是结束时调用它取决于我们希望事情如何工作。在这种情况下,我们将使用覆盖而不是挂接事件处理程序,在方法开始时调用它更有意义。这样,代码将在所有处理程序之后运行,从而使其更像"正常"事件处理程序。

回答

尽管官方框架设计指南另有建议,但大多数类设计人员实际上将使OnXxx()方法负责引发实际事件,如下所示:

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

...因此,如果我们从类继承并且不调用base.OnClick(e),则Click事件将永远不会触发。

因此,是的,即使根据官方设计指南并非如此,但我认为值得肯定的是调用base.OnInit(e)。

回答

official framework design guidelines recommend otherwise

他们是这样?我很好奇,我一直想相反,阅读框架设计指南并运行FxCop只是巩固了我的观点。我的印象是,应始终从带有EventArgs参数的虚拟OnXxx()方法中触发事件

回答

我应该澄清:

该准则建议触发事件应涉及调用虚拟的" OnEventName"方法,但它们还说,如果派生类重写该方法而忘记调用基本方法,则事件仍应触发。

请参阅此页面中途的"重要说明":

Derived classes that override the protected virtual method are not required to call the base class implementation. The base class must continue to work correctly even if its implementation is not called.

回答

这样做可能会更好,然后这场辩论就消失了。不过,这篇文章很有趣,特别是考虑到.NET Framework不遵守该准则的情况。

回答

@ Ch00k和@Scott我不知道我自己喜欢OnEventName模式。是的,我是使用这种方法引发事件的罪魁祸首之一。

我认为重写On *方法并调用基类是方法。处理我们自己的事件似乎是错误的。