【问题标题】:Form constructor vs Form_Load [duplicate]表单构造函数与 Form_Load [重复]
【发布时间】:2025-12-31 08:25:06
【问题描述】:

表单构造函数和form_Load方法有什么区别?

您将物品放在一个与另一个中的过程是什么?

【问题讨论】:

    标签: c# winforms constructor onload


    【解决方案1】:

    不要使用 Load 事件,重写 OnLoad() 方法。这确保了当您从表单类派生时,一切都以可预测的顺序运行。您应该只将它用于需要知道实际表单大小的表单初始化。由于缩放或用户偏好,它可能与设计大小不同,并且在创建本机窗口之前不知道实际大小。

    在 OnLoad 方法中初始化控件是可能的,但它可能非常慢,尤其是对于 ListView 和 TreeView。如果在构造函数中对其进行初始化,则可以在创建其原生 Windows 控件时对其进行批量初始化。

    一个特殊的例外:创建 MDI 子窗口应始终在 OnLoad() 中完成,当您在构造函数中创建子窗口时,管道代码中有一个错误会弄乱 MDI 栏。

    【讨论】:

      【解决方案2】:

      当您创建表单时,构造函数中的代码会立即运行,无论您是否曾经显示它。在Form.Load 事件中运行的代码是一个事件处理程序,因此您实际上可以让其他类(已订阅表单)中的代码在那里运行代码。同样,您可以(从表单中)使用Form.OnLoad method 来运行代码。

      表单的 Load 事件(和 OnLoad 可重写方法,这通常是表单本身的更好选择)在表单初始化后运行。这通常是有好处的,因为所有表单的控件都已经构建好了,更重要的是,所有的表单布局都已经发生了。

      【讨论】:

      • 几件事:1-您多久会构建一个不显示它的表单? (尤其是如果您的依赖项被适当地注入延迟实例化),2-正如下面@Hans 所指出的,此时您的任何控件初始化都会受到性能损失,因为您的布局没有暂停,因此表单上的所有控件都试图响应在初始化时重绘事件之类的事情。 3-我不会使用 OnLoad 来调用我自己的代码;而是为 MyAction() 创建一个方法并从 OnLoad 调用 MyAction() - 否则消费者不清楚他们需要调用 OnLoad 来执行 MyAction
      • @Fred 你没有争论与我写的内容有冲突。我特别提到 OnLoad 发生在初始化之后,并且从未建议在 OnLoad 中添加 控件。至于你的第 3 点——消费者永远不会“调用 OnLoad”——它发生在运行时。如果代码不打算在任何其他位置重用,那么引入另一种方法就没有明显的优势。 (但是,我完全同意,如果“MyAction”是可以重用的东西,它应该采用自己的方法——不过,我的回答并不排除或建议其他方面)
      • 不要考虑添加控件-填充下拉列表、列表框等怎么样?我从经验中说,在 OnLoad 中执行速度较慢。关于 MyAction 的要点是对第一段结尾的(可能是错误的)解释。总的来说,我想说一般的经验法则是不要在 onload 中做任何“重要”的事情。我能想到的唯一有效的操作是需要了解当前布局信息(例如表单的大小/控件的像素位置)。请注意,这对于您是否遵循任何演示模式(例如 MVP)都没有实际意义,因为您的演示者应该处理数据初始化。
      • @Fred 我同意——我只是觉得我从来没有反驳过这些。我的第一段(大部分)只是讨论了两者之间的机械差异,就事情发生的时间和地点而言。
      • 我更喜欢在调用表单的子程序中加载表单的数据(组合框值、绑定源等)。在构造函数之后但在 show 指令之前。对于使用固定数据源(如枚举)的组合框,我改用构造函数。唯一的例外是“启动”表单,当您希望保持应用程序框架处于启用状态时。