Вызов Clear также удаляет элементы?
-
21-09-2019 - |
Вопрос
Во многих случаях существует четкий метод, который удаляет все элементы из коллекций, и эти элементы также удаляются.
Нравиться,
toolStripMenuItem.DropDownItems.Clear();
достаточно, или мне придется позвонить так:
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
Редактировать:Ну, ToolStripItem — это пример, а не вопрос. Для тех, кто говорит, что Clear достаточно, я нашел еще один пример: TabControl также имеет коллекцию элементов и метод очистки.Но TabControls может иметь сложные элементы управления (по крайней мере, у меня), которые необходимо явно Dispose (даже если в какой-то момент они автоматически удаляются сборщиком мусора, поскольку они занимают огромный объем памяти).Я думаю, лучший ответ — это комментарий Divo, чтобы удалить элементы, а затем вызвать очистку.
Решение
Вопрос: Делает?
А: Нет - Clear
не удаляет элементы (их можно использовать в других частях вашего приложения).
Итак, если ваши ToolStripItems являются стандартными .NET, следует Clear
быть достаточным?После некоторого размышления я бы сказал: «Вероятно, нет».
Да, это правда: если у вас будут какие-либо ссылки на ToolStripItem в другой части вашего приложения, .NET Уборщик мусора уничтожит (используйте класс деструктор) это автоматически.Но это не позвоню в Dispose(true)
метод, что, однако, необходимо для формы IDisposable
компоненты.
Прочитать предложение этот и этот.
На самом деле, я считаю, что вам, однако, необходимо явно Dispose
ваши элементы, такие как ToolStrip Утилизировать метод делает (заменяет этот к ваш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
сорт).
Я так не думаю, более того, это может вызвать множество логических проблем, поскольку у вас может быть ссылка на этот объект в коллекции для дальнейшего использования.Если у вас нет ссылок на эти объекты, сборщик мусора уничтожит эти объекты позже.