Предположим, у меня есть какая-то коллекция, которая сама содержит коллекции; например, словарь (из строки, список (из MyClass)). Если я хочу полностью очистить коллекцию, имеет ли смысл очищать каждую отдельную дочернюю коллекцию перед очисткой родительской коллекции, например:
For Each ListDef As KeyValuePair(Of String, List(Of MyClass)) In MasterDictionary
Dim ThisList As List(Of MyClass) = ListDef.Value
ThisList.Clear()
Next
MasterDictionary.Clear()
Или это действительно не более чем просто:
MasterDictionary.Clear()
Я спрашиваю, есть ли какая-либо причина - производительность, безопасность, ясность и т. Д. - использовать первый метод. Я обычно использую второй метод сам, поскольку я предполагаю, что он неявно достигает того, что делает первый метод в любом случае. Но мы все знаем, как опасно иногда предполагать; отсюда этот вопрос.
РЕДАКТИРОВАТЬ : Сегодня в моем собственном заявлении я нашел убедительные доказательства того, что первый метод может быть предпочтительным в определенных случаях. В моем приложении есть несколько глобальных коллекций (словари, содержащие списки, как в приведенном выше примере кода), которые заполняются, когда пользователь нажимает кнопку с надписью «Загрузить данные». Когда пользователь нажимает «Разгрузить данные», чтобы начать сначала, я ранее очищал эти коллекции, используя второй метод выше.
Проблема заключалась в том, что когда пользователь нажимал «Загрузить данные» во второй раз, приложение внезапно становилось очень медленным. В конце концов он снова закончит заполнять коллекции, но в темпе улитки. Я не мог понять, как решить эту проблему, пока я наконец не попробовал первый метод выше. Теперь перезагрузка и повторное заполнение коллекций работает так же быстро, как и загрузка их в первый раз.
Исходя из опубликованных ответов, похоже, что у меня должен быть "другой код где-то", ссылающийся на дочерние коллекции; однако, это не выглядит для меня как я. Единственные места, на которые я ссылаюсь на этих детей, это где я перебираю их родителей; если родители очищены, то у них не должно быть детей, о которых известно в коде, верно?
Надеюсь, кто-то может помочь мне понять, как эти ссылки все еще существуют, или что происходит, что я пропускаю.