代码之家  ›  专栏  ›  技术社区  ›  Scott Muc

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

  •  2
  • Scott Muc  · 技术社区  · 17 年前

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

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

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

    • 是否需要调用base.oniit()方法?
    • 它会被隐式调用吗?
    • 在方法的开头还是结尾调用它比较好?
    • 如果对基本方法的混淆会给您带来麻烦,那么会出现什么情况呢?
    6 回复  |  直到 17 年前
        1
  •  3
  •   Matt Hamilton    17 年前

    我应该澄清:

    指南建议触发事件应该包括调用虚拟的 事件名称 “方法,但是他们也说,如果派生类重写了该方法并忘记调用基方法,则事件仍应激发。

    请看下半部分的“重要提示” this page :

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

        2
  •  0
  •   David Wengier    17 年前

    在这种情况下,如果您不调用init中的基,那么init甚至不会触发。

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

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

        3
  •  0
  •   Matt Hamilton    17 年前

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

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

    …因此,如果从类继承而不调用base.onclick(e),则不会触发click事件。

    所以是的,即使这样 不应该 根据官方的设计指南,我认为这是值得打电话给基地的。只是为了确定。

        4
  •  0
  •   David Wengier    17 年前

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

    他们这样做了吗?我很好奇,我一直认为相反,阅读框架设计指南和运行fxcop只是巩固了我的观点。我的印象是事件应该总是从采用eventargs参数的virtual onxxx()方法中激发。

        5
  •  0
  •   David Wengier    17 年前

    你最好这样做,然后辩论就结束了。不过,这篇文章很有趣,特别是考虑到.NET框架不符合这一准则。

        6
  •  0
  •   Matt Hamilton    17 年前

    @CH00K和@Scott I Dunno-我喜欢开的 事件名称 给自己定型。是的,我是其中一个犯有从那个方法中解雇事件的人。

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