2008-09-16 16 views
2

Dans une application VB6, j'ai un Dictionary dont les clés sont String s et les valeurs sont des instances d'une classe personnalisée. Si j'appelle le RemoveAll() sur le Dictionary, va-t-il d'abord libérer les objets personnalisés? Ou ai-je explicitement besoin de le faire moi-même?La méthode RemoveAll() de Scripting.Dictionary libère-t-elle tous ses éléments en premier?

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 

Répondre

4

Oui, tous les objets du Dictionary seront libérés après un appel à RemoveAll(). D'un point de vue performance (comme en vitesse), je dirais que les lignes qui définissent les variables à Nothing sont inutiles, car le code doit d'abord les rechercher en fonction des noms de clés, tandis que RemoveAll() va énumérer et libérer tout dans une boucle.

2

RemoveAll va supprimer toutes les associations du Dictionary: à la fois les clés et les valeurs. Ce serait une fuite de référence pour le Dictionary de garder une référence aux valeurs dans le Dictionary.

0

S'il n'y a pas d'autres variables qui référencent les éléments de la collection, ces objets doivent être remis au récupérateur de place pour être nettoyés lors de la prochaine exécution du GC. Si par exemple vous faites ceci lorsque sObj est une variable statique quelque part alors le moment où le GC est invoqué par le système, le premier objet sera nettoyé mais le second qui est toujours référencé par sObj ne le sera pas.

d("a") = New clsCustom 
d("b") = New clsCustom code. 
sObj = d("b") 

d.RemoveAll() 
+1

-1 Le seul "Garbage Collector" dans _VB6_ est le comptage des références. –