Вызывает ли вызов 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, чтобы удалить предметы, а затем вызывать четкие сообщения.
Ответы
Ответ 1
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();
}
ИЗМЕНИТЬ
Я также создал следующий поток, чтобы более подробно разъяснить этот вопрос.
Ответ 2
Вы должны полагаться на вызов Dispose()
, когда вы имеете дело с неуправляемой памятью, общими ресурсами или большими областями памяти. Кажется, это не так.
Ответ 3
Вызов Clear
не удаляет элементы, но удаляет ссылку из коллекции на элементы. Если бы это была единственная ссылка на элементы, они будут автоматически собираться в мусор, которые вы не можете предсказать, но вы можете управлять с помощью класса GC
.
Ответ 4
Я так не думаю, что это может вызвать множество логических проблем, потому что вы можете ссылаться на этот объект в коллекции для последующего использования. Если у вас нет ссылок на эти объекты, Garbage Collector будет уничтожать эти объекты позже