La méthode RemoveAll () de Scripting.Dictionary libère-t-elle d'abord tous ses éléments?
-
09-06-2019 - |
Question
Dans une application VB6, j'ai un dictionnaire
dont les clés sont String
et dont les valeurs sont des instances d'une classe personnalisée. Si j'appelle RemoveAll ()
dans le Dictionnaire
, les objets personnalisés seront-ils d'abord libérés? Ou ai-je explicitement besoin de le faire moi-même?
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
La solution
Oui, tous les objets du Dictionnaire
seront libérés après un appel à RemoveAll ()
. Du point de vue des performances (comme de la vitesse), je dirais que ces lignes définissant les variables sur Aucune
ne sont pas nécessaires, car le code doit d'abord les rechercher en fonction des noms de clé, tandis que RemoveAll ()
va énumérer et libérer tout en une boucle.
Autres conseils
RemoveAll
supprimera toutes les associations du Dictionnaire
: les clés et les valeurs.
Ce serait une fuite de référence pour le Dictionnaire
de conserver une référence aux valeurs du Dictionnaire
.
S'il n'y a pas d'autres variables référençant les éléments de la collection, ces objets doivent être remis au collecteur de place pour être nettoyés à la prochaine exécution du CPG.
Si, par exemple, vous faites cela lorsque sObj est une variable statique quelque part, lorsque le système est appelé ensuite par le système, le premier objet est nettoyé, mais pas le second référencé par sObj.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()