Нужно ли удалять элементы управления после их утилизации? - PullRequest
16 голосов
/ 06 января 2010

.NET 2

// dynamic textbox adding
myTextBox = new TextBox();
this.Controls.Add(myTextBox);

// ... some code, finally

// dynamic textbox removing
myTextBox.Dispose();

// this.Controls.Remove(myTextBox); ?? is this needed

Маленькое объяснение

  • Конечно, если я избавлюсь от элемента управления, я его больше не увижу, но в любом случае останется «Ничто» в коллекции родительских элементов управления?
  • нужно ли мне, как рекомендует MSDN, удалить все обработчики из элемента управления?

Ответы [ 6 ]

17 голосов
/ 06 января 2010

Нет, нет.
Я попробовал это.

Вы можете вставить следующий код в LINQPad :

var form = new Form();
var b = new Button();
form.Controls.Add(b);
b.Click += delegate { b.Dispose(); };
Application.Run(form);

EDIT : элемент управления будет удален из коллекции Controls формы. Чтобы продемонстрировать это, замените обработчик кликов следующим:

b.Click += delegate { b.Dispose(); MessageBox.Show(form.Controls.Count.ToString());};

Покажет 0.

2 и РЕДАКТИРОВАТЬ : Control.Dispose(bool disposing) содержит следующий код:

                if (parent != null) { 
                    parent.Controls.Remove(this); 
                }
4 голосов
/ 06 января 2010

EDIT:

MSDN предлагает удалить объект из элемента управления и затем вызвать dispose при удалении объекта из коллекции во время выполнения:

http://msdn.microsoft.com/en-us/library/82785s1h%28VS.80%29.aspx

// dynamic textbox adding
myTextBox = new TextBox();
this.Controls.Add(myTextBox);

// ... some code, finally

// dynamic textbox removing
this.Controls.Remove(myTextBox);

myTextBox.Dispose(); 
2 голосов
/ 11 июля 2012

Но, глядя на ответ от Мата, похоже, что это поведение зависит от используемой платформы. Я думаю, он предполагает, что при использовании компактной структуры некоторые элементы управления должны быть удалены, а также удалены.

Так что Microsoft предлагает, чтобы мы всегда удаляли, а затем уничтожали, имеет смысл, особенно если вы перемещаете модули кода в другие платформы.

MRP

1 голос
/ 04 августа 2010

Дополнительная информация о Compact Framework 2 + VS2005 При удалении элемента управления, производного от s.w.f.control, может произойти сбой конструктора, если он не реализует следующее:

Dispose()  
{  
 if(this.parent!=null){  
  this.parent.controls.remove(this);   
 }  
 ....  
}  
1 голос
/ 06 января 2010

После некоторых тестов я обнаружил, что удаленные элементы управления автоматически удаляются из коллекции родительских элементов управления.

Controls.add(myButton); //Control.Count==4
myButton.Dispose(); //Control.Count==3

UPDATE

из метода Dispose (bool) элемента управления:

if (this.parent != null)
{
    this.parent.Controls.Remove(this);
}
0 голосов
/ 06 января 2010

Просто имейте в виду, что если у вас есть некоторый код для итерации по вашим элементам управления и что-то делаете, вы получите исключение, если один из этих элементов управления будет удален. Поэтому, в общем, я бы рекомендовал удалить элемент управления как хорошую практику.

...