Вызывает ли вызов Clear также объекты?

Много раз существует четкий метод, который удаляет все элементы из коллекций, также находятся эти элементы.

Как,

toolStripMenuItem.DropDownItems.Clear();

достаточно, или мне нужно так называть:

foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
 toolStripMenuItem.DropDownItems.Remove(item);
 item.Dispose();
}

Edit: Well ToolStripItem - пример не вопрос, для тех, кто говорит, что Clear достаточно, я нашел другой пример, TabControl также имеет набор элементов и понятный метод. Но TabControls может иметь сложные элементы управления (по крайней мере, у меня есть), которые должны быть явно Dispose (даже если они автоматически удаляются в какой-то точке GC, потому что они берут огромную память). Я думаю, лучшим ответом является комментарий divo, чтобы удалить предметы, а затем вызывать четкие сообщения.

4 ответа

Q: Есть ли?

A: Нет - Clear не удаляет элементы (их можно использовать в других частях приложения).

Итак, если ваши ToolStripItems являются стандартными .NET, должно ли Clear быть достаточным? После некоторого размышления я бы сказал "возможно, нет".

Да, это правда, что если у вас будут какие-либо ссылки на ToolStripItem в другой части вашего приложения,.NET GarbageCollector будет автоматически уничтожать (использовать деструктор класса). Но он не будет вызывать метод Dispose(true), который, однако, необходим для компонентов IDisposable.

Прочтите предложение this и .

Собственно, я считаю, что вам нужно явно указать Dispose ваши элементы, например, метод ToolStrip Dispose (замените это на свой ToolStrip):

if (!this.Items.IsReadOnly)
{
 for (int i = this.Items.Count - 1; i >= 0; i--)
 {
 this.Items[i].Dispose();
 }
 this.Items.Clear();
}

ИЗМЕНИТЬ

Я также создал следующий поток, чтобы более подробно разъяснить этот вопрос.


Вы должны полагаться на вызов Dispose(), когда вы имеете дело с неуправляемой памятью, общими ресурсами или большими областями памяти. Кажется, это не так.


Вызов Clear не удаляет элементы, но удаляет ссылку из коллекции на элементы. Если бы это была единственная ссылка на элементы, они будут автоматически собираться в мусор, которые вы не можете предсказать, но вы можете управлять с помощью класса GC.


Я так не думаю, что это может вызвать множество логических проблем, потому что вы можете ссылаться на этот объект в коллекции для последующего использования. Если у вас нет ссылок на эти объекты, Garbage Collector будет уничтожать эти объекты позже

licensed under cc by-sa 3.0 with attribution.