2010-11-01 4 views
1

En lisant beaucoup de code, je trouve qu'un objet donné Connection, qui implémente IDisposable, est fermé manuellement dans une instruction using. Je vois cela quand je vois du code lié à MySQL.fermeture des connexions dans un bloc utilisant

Il n'est pas nécessaire d'être explicitement fermé. Pourquoi le développeur le fermerait-il manuellement?

using(cnn) 
{ 
    //code is here 
    cnn.close(); 
} 

Est-ce une bonne/utile mesure?

+0

Veuillez utiliser le bouton "code" pour marquer votre code comme code la prochaine fois, cela améliore la lisibilité. –

Répondre

5

fermeture Explicitement dans un bloc using est double emploi , trompeur et redondant donc pour moi, est une mauvaise chose .

+0

Et si vous deviez effectuer plusieurs sélections et insertions avec une logique métier lourde entre les deux? –

+0

Je ne ferais rien différemment. Pourquoi serait-ce différent? Dans "any" utilisant block, je n'appellerais jamais Dispose(), quel que soit l'objet. – Aliostad

+0

Eh bien, vous appelleriez à proximité. Et comme je l'ai dit, il n'est pas garanti que Close est appelé à la disposition. Surtout dans une bibliothèque tierce. Si je devais écrire une enveloppe autour de lui, j'appellerais certainement près avant la disposition. Aussi, si vous ne me parlez pas du commentaire, je ne le verrai probablement pas. –

0

Cela dépend de la connexion. Beaucoup se ferment dans la méthode Dispose. SQLConnection par exemple se ferme dans Dispose.

0

Je pense qu'il est raisonnable de supposer qu'un objet implémentant IDisposable devrait nettoyer ses propres ressources et ne pas exiger la fermeture. Maintenant, il se peut qu'il ne se ferme pas aussi rapidement que vous le souhaitez, vous devez donc les fermer manuellement, mais vous n'utiliserez pas la syntaxe using.

+0

La fermeture d'une connexion à l'intérieur d'un bloc using, la "dégrade" en un raccourci pour essayer ... finalement. – Marijn

0

Ce n'est pas nécessaire, car IDbConnection est spécifié comme fermeture sur Dispose().

(Strictement, il est spécifié que libérer des ressources sur Dispose(), mais cela revient à appeler close Si une sorte de connexion db n'a pas pris de ressources alors il ne devrait pas, mais alors ce ne serait pas être un problème de toute façon). Il peut toutefois être utile d'appeler close avant, car plus les objets de connexion sont fermés tôt, mieux c'est, mais le using peut s'enfuir rapidement du bloc (par exception ou, par exemple, revenir tôt dans certains cas). .

En règle générale, il est bon de garder les blocs d'utilisation agréables et serrés, ce qui supprime l'avantage, mais il peut y avoir des exceptions.

Questions connexes