La méthode RemoveAll () de Scripting.Dictionary libère-t-elle d'abord tous ses éléments?

StackOverflow https://stackoverflow.com/questions/75011

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
Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top