В приложении VB6 у меня есть Dictionary
, ключи которого - String
, а значения - экземпляры настраиваемого класса. Если я вызову 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()
-1 Единственный «Сборщик мусора» в VB6 - это подсчет ссылок.