Вопрос

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

Нравиться,

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 сорт).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top