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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top