O método RemoveAll() do Scripting.Dictionary libera todos os seus elementos primeiro?
-
09-06-2019 - |
Pergunta
Em uma aplicação VB6, eu tenho um Dictionary
cujas chaves são String
s e valores são instâncias de uma classe personalizada.Se eu ligar RemoveAll()
no Dictionary
, primeiro liberará os objetos personalizados?Ou eu preciso explicitamente fazer isso sozinho?
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
Solução
Sim, todos os objetos no Dictionary
será liberado após uma ligação para RemoveAll()
.Do ponto de vista do desempenho (como da velocidade), eu diria que aquelas linhas que definem as variáveis para Nothing
são desnecessários, porque o código precisa primeiro procurá-los com base nos nomes das chaves, enquanto RemoveAll()
irá enumerar e liberar tudo em um loop.
Outras dicas
RemoveAll
removerá todas as associações do Dictionary
:tanto as chaves quanto os valores.Seria um vazamento de referência para o Dictionary
para manter uma referência aos valores no Dictionary
.
Se não houver outras variáveis que façam referência aos itens da coleção, esses objetos deverão ser entregues ao Coletor de Lixo para serem limpos na próxima vez que o GC for executado.
Se você, por exemplo, fizer isso onde sObj é uma variável estática em algum lugar, quando o GC for invocado em seguida pelo sistema, o primeiro objeto será limpo, mas o segundo que ainda é referenciado por sObj não.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()