2010-01-29 9 views
5

Почему Visual Studio добавляет этот код в класс Class.Designer.cs. Может ли кто-нибудь сказать мне, когда эта переменная компонента получит какое-то значение? Какая картина должна следовать здесь?Утилизация элементов управления Winforms

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

ответ

4

Частное поле components используются для отслеживания одноразовых компонентов на форме. Попробуйте перетащить в Timer компонент, и вы должны увидеть что-то вроде этого в конструкторе сгенерированный код:

this.components = new System.ComponentModel.Container(); 
this.timer1 = new System.Windows.Forms.Timer(this.components); 

Шаблон отображается в методе Dispose(bool) обычно называют как thedisposablepattern. В принципе, шаблон гарантирует, что все отслеживаемые компоненты будут удалены, даже если вы никогда не вызываете метод Dispose явно, и в этом случае базовый класс вашей формы вызовет метод Dispose в своем финализаторе (во время сбора мусора).

1

components присваивается при добавлении не визуальных компонентов, которые также необходимо размещать детерминированным способом (для получения дополнительной информации см. Шаблон IDisposable).

0

Не все компоненты используют его, например, HelpProvider и EventLog. Вы можете даже прокомментировать это в этих случаях. Похоже на меня.

+0

Хех, в форме без каких-либо одноразовых компонентов, Resharper предлагает сделать поле 'readonly' :) –

4

Это код, который создается шаблоном элемента формы (common7 \ ide \ itemtemplates \ csharp \ windows forms \ 1033 \ form.zip \ form.designer.cs). На самом деле у него есть ошибка, метод InitializeComponent(), который он содержит, инициализирует переменную «this.components» без необходимости. Вы можете безопасно удалить инструкцию из кода, если ваша форма не содержит каких-либо компонентов. Дизайнер автоматически вернет его, если вы добавите компонент позже.

Другое, что не так приятно, заключается в том, что метод Dispose() помещается в файл Designer.cs. Он действительно принадлежит файлу form.cs, поэтому вы можете добавлять вызовы Dispose() для полей в вашей форме, которые должны быть удалены. Не стесняйтесь перемещать код самостоятельно, поэтому для модификации файла дизайнера нет никаких неприятных побочных эффектов. Просто держитесь подальше от кода, заключенного в квадратные скобки с областью «сгенерированный код».

Как уже упоминалось в большинстве других ответов, этот код необходим для вызова метода Dispose() любых компонентов, которые вы сбросили в форме, когда форма закрыта. Элементы управления в форме также должны быть удалены, но это автоматически. Класс Form находит их обратно, итерируя коллекцию Controls.

Смежные вопросы