【问题标题】:Calling base Methods When Overriding Page Level Events覆盖页面级事件时调用基本方法
【发布时间】:2010-09-06 08:46:47
【问题描述】:

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

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

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

  • 是否需要调用 base.OnInit() 方法?
  • 会被隐式调用吗?
  • 是在方法的开头还是结尾调用更好?
  • 如果混淆基本方法会给您带来麻烦,有什么例子?

【问题讨论】:

    标签: asp.net events webforms


    【解决方案1】:

    我应该澄清一下:

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

    请参阅“重要说明”大约一半this page

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

    【讨论】:

      【解决方案2】:

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

      一般来说,最好的做法是始终调用基本方法,除非您明确知道不希望发生基本行为。

      在开始或结束时调用它取决于您希望事情如何工作。在这种情况下,您使用覆盖而不是连接事件处理程序,在方法开始时调用它更有意义。这样,您的代码将在任何处理程序之后运行,这使得它更模拟“正常”事件处理程序。

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            你可能最好这样做,然后这场辩论就会消失。不过这篇文章很有趣,尤其是考虑到 .NET Framework 不遵守此准则。

            【讨论】:

              【解决方案6】:

              @Ch00k 和@Scott 我不知道 - 我自己喜欢 OnEventName 模式。是的,我是因使用该方法触发事件而感到内疚的人之一。

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

              【讨论】:

                猜你喜欢
                • 2023-03-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-03
                • 2011-11-03
                • 1970-01-01
                相关资源
                最近更新 更多