Il metodo RemoveAll() di Scripting.Dictionary rilascia prima tutti i suoi elementi?
-
09-06-2019 - |
Domanda
In un'applicazione VB6, ho un file Dictionary
di chi sono le chiavi String
e i valori sono istanze di una classe personalizzata.Se chiamo RemoveAll()
sul Dictionary
, libererà prima gli oggetti personalizzati?Oppure devo esplicitamente farlo da solo?
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
Soluzione
Sì, tutti gli oggetti nel file Dictionary
verrà rilasciato dopo una chiamata a RemoveAll()
.Dal punto di vista delle prestazioni (come della velocità), direi che quelle linee impostano le variabili Nothing
non sono necessari, perché il codice deve prima cercarli in base ai nomi delle chiavi mentre RemoveAll()
enumererà e rilascerà tutto in un unico ciclo.
Altri suggerimenti
RemoveAll
rimuoverà tutte le associazioni dal file Dictionary
:sia le chiavi che i valori.Sarebbe una fuga di riferimento per il Dictionary
per mantenere un riferimento ai valori nel file Dictionary
.
Se non sono presenti altre variabili che fanno riferimento agli elementi nella raccolta, tali oggetti devono essere consegnati al Garbage Collector per essere ripuliti alla successiva esecuzione del GC.
Se, ad esempio, lo fai dove sObj è una variabile statica da qualche parte, quando il GC viene richiamato successivamente dal sistema, il primo oggetto verrà ripulito ma il secondo a cui fa ancora riferimento sObj no.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()