web-dev-qa-db-ja.com

Winformsデザイナーによって生成されたIContainerのコンポーネントの目的は何ですか?

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);
      }
  }

それは何のためですか?これに関するドキュメントや情報を見つけることができませんでした。

36
bentsai

UI以外のコンポーネント(Timerコンポーネントなど)をフォームに追加すると、componentsがそれらのコンポーネントの親になります。デザイナファイルのコードにより、フォームが破棄されるときにこれらのコンポーネントが確実に破棄されます。設計時にこのようなコンポーネントをフォームに追加していない場合、componentsnullになります。

componentsはデザイナーによって生成され、フォームに非UIコンポーネントがない場合(設計時)はnullになるため、他の方法でこれらのコンポーネントを管理することを個人的に選択します。それらを近い形などに配置します。

24
Fredrik Mörk

components変数は、フォームのControls変数と同等です。 allがフォームに配置されたコントロールを追跡します。フォームが閉じたときにすべてのコントロールを自動的に破棄できるように、これは非常に重要なクリーンアップの義務です。

フォームクラスには、設計時にドロップされたすべてのコンポーネントを追跡する同等のメンバーがないため、デザイナーが自動的に処理します。

Dispose()メソッドをDesigner.csファイルからメインフォームのソースコードファイルに移動しても問題ありません。そうすることを強くお勧めします。Formクラスを「特別」にする理由はありません。これは、他のように単なるマネージクラスです。 base.Dispose呼び出しの前に、Dispose()呼び出しを追加して、必要に応じてメンバーを破棄します。

23
Hans Passant