Подтвердить что ты не робот

Какова цель компонентов IContainer, созданных дизайнером Winforms?

При создании новой формы в 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 уже реализуется конструктором).

Итак, например, если моя форма имеет шрифт, я могу убедиться, что она удалена, добавив ее в components следующим образом:

  public partial class Form1 : Form
  {
      Font coolFont;

      public Form1()
      {
          InitializeComponent();
          this.coolFont = new Font("Comic Sans", 12);
          components.Add(this.coolFont);
      }
  }

Это для чего? Я не смог найти никакой документации или информации об этом.

4b9b3361

Ответ 1

Когда вы добавляете в форму компоненты, отличные от UI (например, компонент Timer), components будет родителем этих компонентов. Код в файле конструктора гарантирует, что эти компоненты будут удалены, когда форма будет удалена. Если вы не добавили какие-либо такие компоненты в форму во время разработки, components будет null.

Так как components является конструктором, сгенерированным и будет null, если у вас нет компонентов, не относящихся к пользовательскому интерфейсу в форме (во время разработки), я лично предпочел бы управлять этими компонентами каким-либо другим способом, форма близка или что-то в этом роде.

Ответ 2

Переменная компонентов является эквивалентом переменной Forms. Который отслеживает все элементы управления, помещенные в форму. Чтобы форма могла автоматически распределять все элементы управления, когда она закрыта, очень важная операция очистки.

Класс формы не имеет эквивалентного члена, который отслеживает все компоненты, которые были сброшены на него во время разработки, поэтому разработчик автоматически об этом заботится.

Обратите внимание, что перемещение метода Dispose() из файла Designer.cs в файл исходного файла основной формы вполне приемлемо. Я настоятельно рекомендую вам это сделать, никаких оснований для того, чтобы сделать класс формы "особым" каким-либо образом, это просто управляемый класс, как любой другой. Добавьте Dispose() вызовы для размещения участников по мере необходимости перед вызовом base.Dispose.