C# 表单构造函数与表单加载

C# 表单构造函数与表单加载,c#,winforms,constructor,onload,C#,Winforms,Constructor,Onload,表单构造函数和表单加载方法之间有什么区别 将项目放置在其中一个与另一个之间的过程是什么?创建表单时,构造函数中的代码会立即运行,无论是否显示表单。在表单中运行的代码。Load事件是一个事件处理程序,因此您可以让其他类(订阅了表单)中的代码在那里运行代码。类似地,您可以(从表单)使用来运行代码 表单的加载事件(以及OnLoad可重写方法,这在表单本身中通常是更好的选择)在表单初始化后运行。这通常是有好处的,因为表单的所有控件都已构建,更重要的是,所有表单布局都已发生。不要使用加载事件,请重写OnL

表单构造函数和表单加载方法之间有什么区别


将项目放置在其中一个与另一个之间的过程是什么?

创建表单时,构造函数中的代码会立即运行,无论是否显示表单。在表单中运行的代码。Load事件是一个事件处理程序,因此您可以让其他类(订阅了表单)中的代码在那里运行代码。类似地,您可以(从表单)使用来运行代码


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

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

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


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

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