Reutilizar uma variável no VB6 é uma boa ideia?
-
09-06-2019 - |
Pergunta
Essencialmente eu quero saber se no VB.NET 2005 se usar um sqlcommand e depois reutilizá-lo usando o NEW está errado.Isso causará um vazamento de memória.
POR EXEMPLO:
try
dim mySQL as new sqlcommand(sSQL, cnInput)
// do a sql execute and read the data
mySQL = new sqlcommand(sSQLdifferent, cnInput)
// do sql execute and read the data
catch ...
finally
if mysql isnot nothing then
mysql.dispose
mysql = nothing
end if
EDITAR:coloque try catch para evitar comentários sobre não usá-los
Solução
Apenas para estender o que Longhorn213 disse, aqui está o código:
Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
' do stuff'
End Using
Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
' do other stuff'
End Using
(editar) Assim como para sua informação, using envolve automaticamente o bloco de código em torno de um try/finalmente que chama o método Dispose na variável com a qual foi criado.Assim, é uma maneira fácil de garantir que seu recurso seja liberado. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
Outras dicas
A coleta de lixo reunirá os primeiros novos quando for executada.
Somente o segundo que você descarta propositalmente no bloco Finalmente.O primeiro será descartado na próxima vez que a coleta de lixo for executada.
Não creio que seja uma boa ideia.Se o primeiro comando não for fechado corretamente é possível que você tenha uma conexão aberta com o banco de dados e ela não seja descartada.
A melhor maneira seria descartar o primeiro comando depois de usá-lo e reutilizá-lo.
Uh, para todas aquelas pessoas dizendo "está tudo bem, não se preocupe com isso, a CG cuidará disso..." o todo apontar do Dispose
padrão é lidar com esses recursos que o GC não pode descartar.Então, se um objeto tem um Dispose
método, é melhor chamá-lo quando terminar!
Em resumo, Longhorn213 está correto, ouça-o.
Uma coisa que nunca descobri: se eu tiver uma classe implementando IDisposable
, mas eu nunca descarto isso sozinho, apenas deixo para o GC, o GC realmente ligará Dispose
para mim?
Não, o coletor de lixo encontrará a versão antiga do mySql e a desalocará no devido tempo.
O coletor de lixo deve coletar qualquer coisa que tenha sido desreferenciada, desde que não tenha sido movida para o Large Object Heap.
Embora a coleta de lixo limpe depois de você eventualmente o padrão de descarte existe para ajudar o sistema a liberar quaisquer recursos associados ao objeto mais cedo. Portanto, você deve chamar o descarte assim que terminar de usar o objeto, antes de reatribuí-lo.
Tome cuidado.Se você tiver que fazer muitas dessas coisas em um loop, pode ser lento.É muito melhor apenas atualizar a propriedade .CommandText do mesmo comando, assim (você também pode limpar um pouco a sintaxe):
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
Claro, isso só funciona se o primeiro comando não estiver mais ativo.Se você ainda estiver passando por um leitor de dados, é melhor criar um novo comando.