【问题标题】:Form_Load() 'event' or Override OnLoad()Form_Load() '事件' 或覆盖 OnLoad()
【发布时间】:2011-04-09 21:45:18
【问题描述】:

我希望有人尝试解释这些之间的区别。更具体地说,示例使用场景。

我正在重构一些 Windows 窗体 代码,FormForm_Load() 事件和调用base.OnLoad(e);protected override void OnLoad() 事件中有一些代码现在我跟踪它并且覆盖首先触发,然后立即触发事件版本。

那么,通常使用哪一种?为什么?

【问题讨论】:

标签: .net winforms events refactoring overriding


【解决方案1】:

OnLoad 引发 Load 事件,Form_Load 处理该事件。请参阅MSDN article

因此,在您的代码中,在初始化函数结束时,您可以调用 OnLoad 函数。然后基类将调用您可能已在初始化代码中设置的事件处理程序(在本例中为Form_Load)。

就我个人而言,我会将我的代码放在Form_Init 中并留下OnLoad 来启动事件,因为我正在处理事件,尽管你可以有充分的理由为任何一个辩护,正如你从你的答案中看到的那样。

【讨论】:

  • 我可能很密集,但我认为您正在确认我所说的关于 OnLoad 调用 Load 事件的内容,但这是否回答了我应该将代码放入哪一个的问题?在我看来,只要是在base.OnLoad(e) 调用之后,我就可以将其放入其中任何一个都具有相同的效果。
  • 这个答案没有解决问题,这不是关于是否调用 OnLoad,而是关于是否覆盖它。跨度>
【解决方案2】:

当覆盖OnLoad 时,对base.OnLoad 的调用会调用Form 的Load-事件。

protected override void OnLoad(EventArgs e)
{
  // do stuff before Load-event is raised
  base.OnLoad(e);
  // do stuff after Load-event was raised
}

如果您在引发 Load 事件之前不需要执行某些操作,则将代码放在 OnLoad after base.OnLoad(e) 与将其放在 @ 中提供相同的运行时行为987654327@ 事件处理程序。

我建议重写方法而不是订阅事件。

【讨论】:

  • 感谢您的回复,但听起来您是说除了表单加载时间之外,我的问题没有明确的答案,对吗?
  • 我个人会重写 OnLoad 方法,因为这是创建继承类时的典型方法。正如 Hans Passant 所提到的,这些事件适用于可以订阅这些事件的其他类。但实际上并没有真正的区别。
【解决方案3】:

您应该始终覆盖 OnLoad()。仅当 另一个 类对该事件感兴趣时才适合使用该事件。这就是事件的用途。另一个对 Load 事件感兴趣的类非常少见,只有在做窗口排列时才真正有用。

不过,Load 事件与设计器配合得很好,而且 VB6 程序员对此非常满意。这并不是大错特错,只有当您开始继承表单并且代码没有以正确的顺序运行时,您才会遇到麻烦。

现在放入 Load 事件的大多数代码确实属于构造函数。仅在以下情况下才需要 OnLoad:

  • 您需要知道窗口的确切大小和位置。 OnLoad 是最好的,创建窗口句柄并应用用户首选项(标题和边框大小),并按照 Form.AutoScaleMode 属性的指示重新调整表单。窗口尚不可见,这是将窗口移至其他位置或排列子控件的好时机。
  • 您的代码需要 Handle 属性。这是微妙的,你不能总是说出来。在构造函数中有这样的代码是不健康的,窗口是在构造函数完成之前创建的。它通常会有一个好的结果,但它会使创建表单变得非常缓慢。从调用堆栈窗口轻松诊断。
  • 为了避免 MDI 实现中的错误。如果您在父构造函数中创建一个 MDI 子代,那么您将获得重复的字形,当您最大化该子代时可见。改为在 OnLoad 中创建子节点。

【讨论】:

  • 所以,如果我错了,请阻止我,但使用 OnLoad() 更“正确”,但我需要认识到其中的代码无法用于另一个班级。对吗?
  • 可用于派生类 base.OnLoad()。跳过基类的初始化几乎总是错误的。 另一个类与Load/OnLoad中的代码无关。
  • 因此,如果派生类调用OnLoad(),它将触发base.OnLoad(),然后是我在其后添加的任何代码。
  • 派生类从不调用 OnLoad,这就是 kaboom。总是 base.OnLoad()。
  • @sne - 一个好的答案不适合评论框。我建议你开始自己的线程。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2016-12-28
相关资源
最近更新 更多