La réutilisation d’une variable dans VB6 est-elle une bonne idée ?
-
09-06-2019 - |
Question
Essentiellement, je veux savoir si dans VB.NET 2005, utiliser une commande sql, puis la réutiliser en utilisant le NEW est une erreur.Cela provoquera-t-il une fuite de mémoire.
PAR EXEMPLE:
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
MODIFIER:mettez try catch pour éviter les commentaires sur le fait de ne pas les utiliser
La solution
Juste pour étendre ce que Longhorn213 a dit, voici le code correspondant :
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
(modifier) Tout comme pour information, using enveloppe automatiquement le bloc de code autour d'un try/finally qui appelle la méthode Dispose sur la variable avec laquelle il est créé.C'est donc un moyen simple de garantir la libération de votre ressource. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
Autres conseils
La collecte des déchets récupérera les premiers nouveaux lors de son exécution.
Uniquement le deuxième que vous disposez volontairement dans le bloc Enfin.Le premier sera supprimé lors de la prochaine exécution du garbage collection.
Je ne pense pas que ce soit une bonne idée.Si la première commande n'est pas fermée correctement, il est possible que vous ayez une connexion ouverte à la base de données et qu'elle ne soit pas supprimée.
Une meilleure façon serait de supprimer la première commande une fois que vous avez fini de l'utiliser, puis de la réutiliser.
Euh, à tous ces gens qui disent "c'est bon, ne vous inquiétez pas, le GC s'en occupe..." le tout indiquer de la Dispose
Le modèle consiste à gérer ces ressources par le GC. ne peut pas se débarrasser.Donc si un objet a un Dispose
méthode, vous feriez mieux de l'appeler lorsque vous en aurez terminé !
En résumé, Longhorn213 a raison, écoutez-le.
Une chose que je n'ai jamais résolue : si j'ai une classe qui implémente IDisposable
, mais je ne m'en débarrasse jamais moi-même, je le laisse juste traîner pour le GC, le GC appellera-t-il réellement Dispose
pour moi?
Non, le garbage collector trouvera l'ancienne version de mySql et la libérera en temps voulu.
Le garbage collector doit récupérer tout ce qui a été déréférencé tant qu'il n'a pas été déplacé dans le tas d'objets volumineux.
Tandis que la collecte des déchets nettoiera après vous finalement le modèle de suppression est là pour aider le système à libérer plus tôt toutes les ressources associées à l'objet. Vous devez donc appeler dispose une fois que vous avez terminé avec l'objet avant de le réaffecter.
Sois prudent.Si vous devez en faire beaucoup en boucle, cela peut être lent.Il est préférable de simplement mettre à jour la propriété .CommandText de la même commande, comme ceci (vous pouvez également nettoyer un peu la syntaxe) :
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
Bien entendu, cela ne fonctionne que si la première commande n'est plus active.Si vous êtes toujours en train d'utiliser un lecteur de données, vous feriez mieux de créer une nouvelle commande.