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

时间:2008-08-21 03:33:26

标签: asp.net events webforms

在我的代码背后,我将事件连接起来:

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

我这样做是因为这就是我在例子中看到的。

  • 是否需要调用base.OnInit()方法?
  • 是否会被隐含地称为?
  • 最好在方法开头或结束时调用它吗?
  • 什么是基础方法混淆可以让你遇到麻烦的例子?

6 个答案:

答案 0 :(得分:3)

我应该澄清一下:

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

请查看关于this page中途的“重要说明”:

  

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

答案 1 :(得分:0)

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

通常,最好始终调用基本方法,除非您明确知道不希望基本行为发生。

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

答案 2 :(得分:0)

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

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

...所以如果你从类中继承并且不调用base.OnClick(e),则Click事件永远不会触发。

所以是的,即使根据官方设计指南,不应该,我认为值得称之为base.OnInit(e)以确保。

答案 3 :(得分:0)

  

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

@ Ch00k和@Scott我不知道 - 我自己喜欢On EventName 模式。是的,我是那个用这种方法解雇事件的人之一。

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