Es la reutilización de una variable en VB6 una buena idea?
-
09-06-2019 - |
Pregunta
Básicamente quiero saber si en VB.NET 2005 si el uso de un sqlcommand y, a continuación, volver a utilizarlos con la NUEVA que está mal.Va a provocar una pérdida de memoria.
Por ejemplo:
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:poner try catch para evitar los comentarios sobre el no uso de ellos
Solución
Sólo para ampliar lo Longhorn213 dijo, aquí está el 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
(edición), así como un FYI, utilizando ajusta automáticamente el bloque de código alrededor de un try/finally que llama al método Dispose de la variable se crea con.Por lo tanto, es una manera fácil de asegurarse de que su recurso sea liberado. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
Otros consejos
La recolección de basura se reunirán hasta el primer nuevo cuando se ejecuta.
Sólo el segundo, adrede disponer en el bloque Finally.El primero va a ser eliminados de la próxima vez que la recolección de basura se ejecuta.
Yo creo que esta no es una buena idea.Si el primer comando no está cerrada correctamente es posible que hubiera una conexión abierta con la base de datos y no serán eliminados.
Una mejor manera sería desechar el primer comando después de que haya terminado de utilizarlo, y, a continuación, volver a utilizarla.
Uh, a todas aquellas personas diciendo: "está bien, no te preocupes, el GC se manejarlo..." toda la punto de la Dispose
el patrón es para manejar los recursos de la GC no se puede disponer de.Así que si un objeto tiene un Dispose
método, será mejor que la llame cuando haya terminado con él!
En resumen, Longhorn213 es correcta, escucharlo.
Una cosa que nunca he trabajado fuera Si tengo una clase que implementa IDisposable
, pero en realidad nunca deshacerse de mí mismo, me acaba de dejar colgando alrededor de la mesa, se la GC en realidad llamada Dispose
para mí?
No, el recolector de basura encontrar la versión anterior de mySql y desasignar en su debido momento.
El recolector de elementos no utilizados deben de recoger todo lo que ha sido eliminan las referencias siempre y cuando no haya sido movido en el Montón de Objetos Grandes.
Mientras que la recolección de basura de la limpieza después de finalmente el disponer patrón está ahí para ayudar a que el sistema de liberación de los recursos asociados con el objeto de tarde, Así que usted debe llamar a dispose una vez que haya terminado con el objeto antes de volver a asignar a la misma.
Tener cuidado.Si usted tiene que hacer un montón de estos en un bucle puede ser lento.Es mucho mejor acabo de actualizar el .Propiedad CommandText del mismo comando, como este (también, usted puede limpiar la sintaxis un poco):
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
Por supuesto, que sólo funciona si el primer comando ya no está activa.Si usted todavía está en el medio de ir a través de un datareader entonces es mejor crear un nuevo comando.