Подтвердить что ты не робот

Вызывает ли вызов 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, чтобы удалить предметы, а затем вызывать четкие сообщения.

4b9b3361

Ответ 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 будет уничтожать эти объекты позже