2

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

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

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

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

6 回答 6

3

我应该澄清:

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

请参阅本页一半左右的“重要说明” :

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

于 2008-08-21T03:46:51.800 回答
0

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

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

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

于 2008-08-21T03:38:41.770 回答
0

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

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

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

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

于 2008-08-21T03:41:20.097 回答
0

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

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

于 2008-08-21T03:43:57.827 回答
0

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

于 2008-08-21T03:57:19.823 回答
0

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

我认为覆盖 On* 方法并调用基本方法是要走的路。不知何故,处理自己的事件似乎是错误的。

于 2008-08-21T04:09:00.530 回答