在Form Constructors和Form Load事件中应该使用哪些设置代码?

Gre*_*reg 55 c# constructor onload-event winforms

对于winforms应用程序,我想知道应该使用什么设置代码:

  • MainForm的()

而不是

  • MainForm_Load(对象发送者,EventArgs e)

这里有最佳实践指南吗?

Han*_*ant 77

使用VB6的程序员倾向于在Load事件中放入大量代码,在VB6中该事件用于初始化表单.但是在Windows窗体中不再适用,Form类可以有一个构造函数..NET方法是在构造函数中初始化类对象,对于Form类,没有很少的令人信服的理由不这样做.

Load事件在创建窗体的窗口句柄之后立即运行,就在它对用户可见之前.您应该只在依赖于创建句柄的事件处理程序中编写代码.除了一种类型之外,没有一大堆符合此要求的代码:需要知道窗口大小和位置的代码.

当表单在另一台机器上运行时,Form的设计时Size和Location属性值与它们的实际值不同.可以重新调整表单以适应目标计算机上的系统字体大小或视频适配器DPI设置.用户首选项也起作用,用户可能为窗口标题选择了不同的字体大小.除非您希望窗口在桌面上具有特定位置或与其他窗口对齐,否则您通常不关心这些内容.

在Load事件中编写代码来执行初始化TreeView或ListView控件等操作实际上可以大大减慢启动时间.在构造函数中执行此操作时,Windows窗体不必更新物理窗口,尚未创建它.一旦创建了本机控件,Winforms就会使用批量更新而不是一次一个节点/项来初始化它,就像代码在Load事件中运行时一样.很大的区别.

最后但并非最不重要:您永远不应该使用Load事件,您应该覆盖OnLoad()方法.当您(或其他人)从Form类继承时,这可确保代码以可预测的顺序运行.IntelliSense可帮助您编写此方法,只需键入"protected onl"并按Tab键即可使IntelliSense自动完成该方法.注意你可以选择在base.OnLoad()调用之前或之后放置代码,这就是你如何控制谁是老板.当你把它放在后面时,你就是老板,而不是经常选择正确的btw.

  • 为了鼓励程序员在8年前转向.NET,这是熟悉的编程模型.覆盖OnLoad也非常简单,当您开始输入时,IntelliSense可以完成80%的工作.但它需要打字而不是点击.不幸的是,"易于使用"并不总是意味着"正确使用". (11认同)
  • 非常好的信息谢谢 - 但最后一点为什么微软给我们加载事件,以便在VS中轻松使用,如果一个人应该真的重写OnLoad (8认同)

Adr*_*der 11

快速查看Windows窗体中的" 使用构造函数"以确保正确初始化

使用Windows窗体中的构造函数确保正确完成初始化.事件发射顺序并不是一门精确的科学,你不能总是依赖于事件触发的顺序,无论你过去看过什么.

....

因此,Microsoft建议您在Forms构造函数中处理初始化代码,假设您没有真正耗时的初始化,可以进行时间分片或执行DoEvents().

  • "因此,Microsoft建议您在Forms Constructor中处理初始化代码" - 为此建议提供源代码会很好. (5认同)