¿El método RemoveAll() de Scripting.Dictionary libera todos sus elementos primero?
-
09-06-2019 - |
Pregunta
En una aplicación VB6, tengo un Dictionary
cuyas llaves son String
s y valores son instancias de una clase personalizada.si llamo RemoveAll()
sobre el Dictionary
, ¿liberará primero los objetos personalizados?¿O necesito hacerlo explícitamente yo mismo?
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
Solución
Sí, todos los objetos en el Dictionary
será liberado después de una llamada a RemoveAll()
.Desde el punto de vista del rendimiento (como de la velocidad), diría que esas líneas que establecen las variables en Nothing
son innecesarios, porque el código primero debe buscarlos en función de los nombres de las claves, mientras que RemoveAll()
enumerará y publicará todo en un solo bucle.
Otros consejos
RemoveAll
eliminará todas las asociaciones del Dictionary
:tanto las claves como los valores.Sería una fuga de referencia para el Dictionary
mantener una referencia a los valores en el Dictionary
.
Si no hay otras variables que hagan referencia a los elementos de la colección, esos objetos deben entregarse al recolector de basura para que los limpie la próxima vez que se ejecute el GC.
Si, por ejemplo, hace esto donde sObj es una variable estática en algún lugar, cuando el sistema invoque el GC a continuación, el primer objeto se limpiará, pero el segundo al que todavía hace referencia sObj no.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()