web-dev-qa-db-ja.com

フォームコンストラクターとフォームロードイベントでは、どのセットアップコードを使用する必要がありますか?

Winformsアプリケーションの場合、どのセットアップコードを入力する必要があるのか​​疑問に思っています。

  • MainForm()

とは対照的に

  • MainForm_Load(オブジェクト送信者、EventArgs e)

ここにベストプラクティスのガイドラインはありますか?

55
Greg

VB6を使用したことのあるプログラマーは、Loadイベントに多くのコードを入れる傾向があります。VB6では、そのイベントがフォームの初期化に使用されました。しかし、これはWindowsフォームではもはや適切ではありません。Formクラスはコンストラクターを持つことができます。 .NETの方法は、コンストラクターでクラスオブジェクトを初期化することです。これを行わない理由は、Formクラスではほとんどありません。

Loadイベントは、フォームのウィンドウハンドルが作成された直後、ユーザーに表示される直前に実行されます。ハンドルの作成に依存するイベントハンドラーにのみコードを記述してください。ウィンドウのサイズと場所を知る必要があるコードという1種類を除いて、この要件を満たすコードはたくさんありません。

フォームのデザイン時のSizeプロパティとLocationプロパティの値は、フォームが別のマシンで実行されているときの実際の値と同じではありません。フォームは、ターゲットマシンのシステムフォントサイズまたはビデオアダプタのDPI設定に合わせて再スケーリングできます。ユーザー設定も役割を果たします。ユーザーがウィンドウのキャプションに別のフォントサイズを選択した可能性があります。ウィンドウをデスクトップ上の特定の位置に配置したり、他のウィンドウと位置合わせしたりする場合を除いて、通常はこれについては気にしません。

TreeViewまたはListViewコントロールの初期化などを行うLoadイベントでコードを記述すると、実際には起動時間が大幅に遅くなる可能性があります。コンストラクターでこれを行う場合、Windowsフォームはまだ物理ウィンドウを更新する必要はなく、まだ作成されていません。ネイティブコントロールが作成されると、Winformsは、コードがLoadイベントで実行されるときに発生するように、一度に1つのノード/アイテムではなく、一括更新で初期化します。大きな違い。

最後になりましたが、Loadイベントは絶対に使用しないでください。OnLoad()メソッドをオーバーライドする必要があります。これにより、あなた(または他の誰か)がFormクラスから継承するときに、コードが予測可能な順序で実行されるようになります。 IntelliSenseは、このメソッドの作成を支援します。「protected onl」と入力し、Tabキーを押すだけで、IntelliSenseがメソッドをオートコンプリートします。 base.OnLoad()呼び出しの前または後にコードを配置する方法を選択できることに注意してください。これにより、誰が上司であるかを制御できます。あなたがそれを後に置くとき、あなたは上司であり、しばしば正しい選択ではありません。

72
Hans Passant

Windowsフォームでコンストラクターを使用して適切な初期化を確実にする をざっと見てください。

初期化が正しく行われるようにするには、Windowsフォームでコンストラクターを使用します。イベントの発生順序は正確な科学ではなく、過去に何を見たかに関係なく、イベントの発生順序に常に依存できるとは限りません。

..。

このため、タイムスライスを取得したり、DoEvents()を実行したりする可能性のある実際に時間のかかる初期化がないことを前提として、フォームコンストラクタで初期化コードを処理することをお勧めします。

11
Adriaan Stander