Освобождает ли сначала метод RemoveAll() класса Scripting.Dictionary все свои элементы?
-
09-06-2019 - |
Вопрос
В приложении VB6 у меня есть Dictionary
чьи ключи String
s и значения являются экземплярами пользовательского класса.Если я позвоню RemoveAll()
на Dictionary
, сначала освободит пользовательские объекты?Или мне явно нужно сделать это самому?
Dim d as Scripting.Dictionary
d("a") = New clsCustom
d("b") = New clsCustom
' Are these two lines necessary?
Set d("a") = Nothing
Set d("b") = Nothing
d.RemoveAll
Решение
Да, все объекты в Dictionary
будет освобожден после звонка на RemoveAll()
.С точки зрения производительности (как и скорости) я бы сказал, что эти строки устанавливают переменные в Nothing
не нужны, поскольку код должен сначала найти их по именам ключей, тогда как RemoveAll()
перечислит и выпустит все в одном цикле.
Другие советы
RemoveAll
удалит все ассоциации из Dictionary
:как ключи, так и значения.Это будет справочная утечка для Dictionary
сохранить ссылку на значения в Dictionary
.
Если нет других переменных, ссылающихся на элементы в коллекции, эти объекты следует передать сборщику мусора для очистки при следующем запуске GC.
Если вы, например, сделаете это, когда sObj является статической переменной где-то, то при следующем вызове GC системой первый объект будет очищен, а второй, на который все еще ссылается sObj, - нет.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()