重写页面级事件时调用基方法

Calling base Methods When Overriding Page Level Events

提问人:Scott Muc 提问时间:8/21/2008 最后编辑:ST3Scott Muc 更新时间:8/3/2013 访问量:5428

问:

在我的代码中,我像这样连接我的事件:

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

我之所以这样做,是因为这是我在示例中看到的。

  • 做基地。需要调用 OnInit() 方法吗?
  • 它会被隐式调用吗?
  • 在方法的开头调用它好还是在方法结束时调用它更好?
  • 对基本方法的混淆会给您带来麻烦的例子是什么?
asp.net 活动 Web 表单

评论


答:

0赞 David Wengier 8/21/2008 #1

在这种情况下,如果不调用基 OnInit,那么 Init 甚至不会触发。

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

它是在开始还是结束时调用取决于您希望事情如何工作。在这种情况下,您使用的是重写而不是挂接事件处理程序,因此在方法的开头调用它更有意义。这样,您的代码将在任何处理程序之后运行,这使得它更像“普通”事件处理程序。

0赞 Matt Hamilton 8/21/2008 #2

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

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

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

所以是的,即使根据官方设计指南不应该是这种情况,我认为值得称之为 base。OnInit(e) 只是为了确定。

0赞 David Wengier 8/21/2008 #3

官方框架设计指南另有建议

他们有吗?我很好奇,我一直认为相反,阅读框架设计指南和运行 FxCop 只会巩固我的观点。我的印象是,事件应该始终从采用 EventArgs 参数的虚拟 OnXxx() 方法触发

3赞 Matt Hamilton 8/21/2008 #4

我应该澄清一下:

该指南建议触发事件应涉及调用虚拟的“OnEventName”方法,但他们也表示,如果派生类重写该方法并忘记调用基方法,则该事件仍应触发。

请参阅本页中途的“重要说明”:

重写受保护的虚拟方法的派生类不需要调用基类实现。即使未调用基类的实现,基类也必须继续正常工作。

0赞 David Wengier 8/21/2008 #5

你最好这样做,然后这场辩论就消失了。不过,这篇文章很有意思,特别是考虑到 .NET Framework 不遵循此准则。

0赞 Matt Hamilton 8/21/2008 #6

@Ch00k和@Scott我不知道 - 我自己喜欢 OnEventName 模式。是的,我是用这种方法触发事件的人之一。

我认为重写 On* 方法并调用基本方法是要走的路。在某种程度上,处理自己的事件似乎是错误的。