Come riutilizzare una variabile in VB6 una buona idea?
-
09-06-2019 - |
Domanda
Essenzialmente vorrei sapere se in VB.NET 2005 se si utilizza un oggetto sqlcommand e quindi riutilizzare utilizzando il NUOVO è sbagliato.Potrà causare una perdita di memoria.
Ad ESEMPIO:
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
EDIT:mettere try catch, per evitare i commenti non li utilizza
Soluzione
Solo per estendere la cosa Longhorn213 detto, ecco il codice:
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
(edit), Proprio come una CRONACA, utilizzando avvolge automaticamente il blocco di codice in giro un try/finally, che chiama il metodo Dispose sulla variabile è creato con.Così, è un modo semplice per garantire che la vostra risorsa viene rilasciato. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
Altri suggerimenti
Garbage collection, raccoglierà il primo nuovo quando viene eseguito.
Solo il secondo è volutamente smaltire nel blocco Finally.Il primo sarà smaltito la prossima volta che la procedura di garbage collection è in esecuzione.
Io non credo che questo sia una buona idea.Se il primo comando non viene chiuso correttamente, è possibile che tu vorresti aprire una connessione al database e non essere smaltiti.
Un modo migliore sarebbe quello di gettare il primo comando dopo che hai finito di usarlo, e poi riutilizzarlo.
Uh, a tutte quelle persone che dicono "è tutto OK, non preoccuparti, il GC in grado di gestire..." tutto punto del Dispose
modello è in grado di gestire le risorse che il GC non può smaltire.Quindi, se un oggetto ha un Dispose
metodo, è meglio chiamare quando hai finito con esso!
In sintesi, Longhorn213 è corretto, ascoltare lui.
Una cosa che non ho mai lavorato fuori - Se ho una classe che implementa IDisposable
, ma non ho mai effettivamente smaltire me stesso, lascio in giro per il GC, il GC chiama in realtà Dispose
per me?
No, il garbage collector trovare la vecchia versione di mySql e deallocare a tempo debito.
Il garbage collector dovrebbe raccogliere tutto ciò che è stato risolto finché non è stato trasferito in un Heap di Oggetti Grandi.
Mentre la procedura di garbage collection per ripulire dopo alla fine il modello dispose è lì per aiutare il sistema di rilascio di tutte le risorse associate con l'oggetto prima, Così si dovrebbe chiamare dispose una volta che hai finito con l'oggetto prima di ri-assegnando ad essa.
Essere attenti.Se devi fare un sacco di questi in un ciclo può essere lento.È molto meglio per aggiornare solo il .Proprietà CommandText dello stesso comando, come questo (anche, si può pulire la sintassi un po'):
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
Naturalmente, questo funziona solo se il primo comando non è più attivo.Se sei ancora in mezzo attraversando un datareader allora è meglio creare un nuovo comando.