2008-09-16 12 views
2

In einer VB6-Anwendung habe ich eine Dictionary, deren Schlüssel sind String s und Werte sind Instanzen einer benutzerdefinierten Klasse. Wenn ich RemoveAll() auf der Dictionary aufrufen, wird es zuerst die benutzerdefinierten Objekte frei? Oder muss ich das explizit selbst tun?Gibt die RemoveAll() - Methode von Scripting.Dictionary zuerst alle ihre Elemente frei?

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 

Antwort

4

Ja, alle Objekte in der Dictionary wird nach einem Aufruf RemoveAll() freigegeben werden. Aus Sicht der Leistung (wie in der Geschwindigkeit) würde ich sagen, dass die Zeilen, die die Variablen auf Nothing setzen, unnötig sind, weil der Code sie zuerst anhand der Schlüsselnamen suchen muss, während RemoveAll() alles in einer Schleife aufzählt und freigibt.

2

RemoveAll werden alle Zuordnungen aus dem Dictionary entfernt: sowohl die Schlüssel und Werte. Es wäre ein Referenzleck für die Dictionary, einen Verweis auf die Werte in der Dictionary zu halten.

0

Wenn keine anderen Variablen auf die Elemente in der Sammlung verweisen, sollten diese Objekte an den Garbage Collector übergeben werden, damit sie beim nächsten Ausführen des GC bereinigt werden.

Wenn Sie dies zum Beispiel tun, wo sObj irgendwo eine statische Variable ist, dann wird das erste Objekt bereinigt, wenn das GC als nächstes vom System aufgerufen wird, aber die zweite, die noch von sObj referenziert wird, nicht.

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

d.RemoveAll() 
+1

-1 Der einzige "Garbage Collector" in _VB6_ ist Referenzzählung. –