Visual Studioで新しいフォームを作成すると、デザイナーは.Designer.csファイルに次のコードを生成します。
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
components
変数の目的は何ですか?私の理論では、フォームの所有するIDisposable
クラスは、Designerの外部で作成する必要があります(Dispose
は、Designerによって既に実装されているため)。
したがって、たとえば、私のフォームがフォントを所有している場合、次のようにcomponents
に追加することで、フォントが確実に破棄されるようにすることができます。
public partial class Form1 : Form
{
Font coolFont;
public Form1()
{
InitializeComponent();
this.coolFont = new Font("Comic Sans", 12);
components.Add(this.coolFont);
}
}
それは何のためですか?これに関するドキュメントや情報を見つけることができませんでした。
UI以外のコンポーネント(Timer
コンポーネントなど)をフォームに追加すると、components
がそれらのコンポーネントの親になります。デザイナファイルのコードにより、フォームが破棄されるときにこれらのコンポーネントが確実に破棄されます。設計時にこのようなコンポーネントをフォームに追加していない場合、components
はnull
になります。
components
はデザイナーによって生成され、フォームに非UIコンポーネントがない場合(設計時)はnull
になるため、他の方法でこれらのコンポーネントを管理することを個人的に選択します。それらを近い形などに配置します。
components変数は、フォームのControls変数と同等です。 allがフォームに配置されたコントロールを追跡します。フォームが閉じたときにすべてのコントロールを自動的に破棄できるように、これは非常に重要なクリーンアップの義務です。
フォームクラスには、設計時にドロップされたすべてのコンポーネントを追跡する同等のメンバーがないため、デザイナーが自動的に処理します。
Dispose()メソッドをDesigner.csファイルからメインフォームのソースコードファイルに移動しても問題ありません。そうすることを強くお勧めします。Formクラスを「特別」にする理由はありません。これは、他のように単なるマネージクラスです。 base.Dispose呼び出しの前に、Dispose()呼び出しを追加して、必要に応じてメンバーを破棄します。