Est est nécessaire de disposer DbCommand après utilisation?
Nous utilisons la Bibliothèque d'Entreprise 3.0 pour accéder à Oracle DB (microsoft, oracle client).
Ce qui se passe quand je ne dispose pas d'un DbCommand exemple après une procédure stockée ou une fonction est appelée? N' .NET automatiquement recueillir les ordures?
Notez que nous ne assurez-vous que la transaction/connexion se ferme et éliminés correctement.
OriginalL'auteur Vivek | 2009-07-01
Vous devez vous connecter pour publier un commentaire.
C'est un doublon, mais je n'ai pas eu le temps de trouver l'original.
Si elle met en œuvre IDisposable, et si vous l'avez créé, vous devez appeler Jeter sur elle. C'est pourquoi le développeur de la classe a mettre en œuvre IDisposable.
Le garbage collector n'appelle pas Jeter sur tous les IDisposable-la mise en œuvre des objets.
cet article implique que Dispose() sera appelée dans le finaliseur seulement si le finaliseur appelle dispose(). Puisque vous ne pouvez pas être garanti que tous les appels de classe Disposer dans un finaliseur, vous devez faire preuve de diligence au sujet de l'appel vous-même.
Oui, si vous pensez que la classe que vous utilisez n'est pas la mise en œuvre de IDisposable correctement, vous pouvez appeler Disposer vous-même, juste pour être sûr. Mais de là à dire qu'un développeur a une classe IDisposable juste parce qu'ils veulent que vous appelez dispose sur il n'est pas correct.
ce n'est pas ce que vous discutaient avant. Le garbage collector sera toujours appeler en Disposer, ou pas. Avez-vous changé d'avis? Est-ce votre nouvel argument? Si oui, alors s'il vous plaît ajouter une réponse montrant clairement un exemple de cas où il est préférable d'ignorer cette pratique exemplaire. Pourquoi est-ce mieux que de simplement appeler l'élimination ou la mise en œuvre d'une aide du bloc?
si le code est incorrect, alors il n'est pas plus propre. Désolé, l'homme, c'est tout simplement dangereux. Lors de trucs bizarres commence à se produire dans le code que "l'habitude de travailler", la première chose que je cherche c'est de ne pas utiliser de Disposer correctement, suivie par l'incapacité à gérer les exceptions correctement. Vous donnez Murphy une ouverture vous n'avez pas besoin de donner.
OriginalL'auteur
Réflecteur, n'indique pas que
OracleCommand
spécifiquement remplace Dispose (à partir deSystem.ComponentModel.Component
's la mise en œuvre, de toute façon), donc les chances sont qu'il ne sera pas nuire à votre demande si vous ne l'appelez pas.La chose la plus importante, cependant, est que
OracleCommand
intègre spécifiquementIDbCommand
, qui intègre spécifiquementIDisposable
. Si jamais vous avez remplacé votreOracleCommand
avec un autreIDbCommand
, vous souhaiterez probablement utiliserDispose()
. Et tandis queSqlCommand
n'est pas explicitement remplacerDispose()
, Odbc et OleDb certainement le faire.En bref, puisque c'est
IDisposable
, vous devriez jeter, juste pour être sur le côté sécuritaire.OriginalL'auteur
À partir de la documentation pour
IDisposable
:Compte tenu de cela, un objet qui implémente
IDisposable
potentiellement maintient les références à non géré ressources. Ces ressources ne sont pas libérés jusqu'à ce que le garbage collector vient le long et recueille l'objet. Cependant, puisque vous ne pouvez pas savoir quand le garbage collector ce faire, jetable objets (tels que lesOracleDbCommand
) peut traîner beaucoup plus longtemps que vous ne le souhaitez.Si un objet implémente
IDisposable
, vous devrait l'appeler dès que possible afin de libérer les ressources non managées qu'il contient des références. Ceci peut être accompli soit en appelantDispose
directement ou par le déclarant dans un bloc using.C'est précisément pourquoi une classe implémente IDisposable. Le GC peut pas car il ne les connaît pas. La classe qui détient les ressources non managées doit libérer lorsque la méthode dispose est invoquée.
Mais vous avez dit "Ces ressources ne sont pas libérés jusqu'à ce que le garbage collector vient le long et recueille l'objet". La libération de ces ressources non managées n'est pas, en général, dépendent du garbage collector.
En fait, Microsoft a déclaré que. Voir msdn.microsoft.com/en-us/library/system.idisposable.aspx. Donc, en réalité, la version correcte de ces ressources t dépendent de la mise en œuvre de IDisposable. Le GC n'a aucune idée que vous avez alloué une ressource non managée; par conséquent, il ne peut pas libérer pour vous. Quand vient le temps de recueillir votre objet, vous êtes donné une occasion de libérer ces objets vous-même, à travers la mise en œuvre de IDisposable.
Vous ne pouvez pas changer pour libérer les objets, sauf si vous avez mis en place un outil de finalisation. Quelqu'un qui utilise un objet la mise en œuvre de IDisposable ne peut pas dépendre de ce que cela a été fait. La seule façon d'être sûr d'obtenir toutes les ressources non managées libéré est explicitement appel Disposer vous-même, et pas supposer que le GC va prendre soin d'elle. La manière habituelle de s'assurer de Disposer est appelé par une instruction d'utilisation.
OriginalL'auteur
Pas sûr à 100% sur Oracle, mais lors de l'utilisation de SqlCommand, il doit être jeté après utilisation. Vous pouvez soit simplement appeler .Dispose(), ou tout simplement le mettre dans l'aide du bloc, comme suit:
OriginalL'auteur