Comment mettre en œuvre IDisposable correctement
J'ai vu tellement de code C# dans mon temps en tant que développeur qui a pour but d'aider le GC par des variables de réglage à la valeur null ou en appelant Dispose() sur les classes (DataSet par exemple) à l'intérieur de leurs propres classes méthode dispose() qui
Je me demandais si il n'y a aucun besoin de le mettre en œuvre dans un environnement géré.
Est ce code qu'une perte de temps dans son modèle de conception?
class MyClass : IDisposable
{
#region IDisposable Members
public void Dispose()
{
otherVariable = null;
if (dataSet != null)
{
dataSet.Dispose();
}
}
#endregion
}
OriginalL'auteur | 2010-04-29
Vous devez vous connecter pour publier un commentaire.
La GC ne pas appel
.Dispose()
(Il n'a, toutefois, appelez le finaliser~MyClass()
méthode, vous pouvez fournir un appel à laDispose()
méthode pour avoir des ressources gérées automatiquement lorsque le GC décide de nettoyer votre classe).Vous devez toujours fournir un moyen d'éliminer les ressources internes telles que
DataSets
de code qui utilise les classes (et assurez-vous réellement appeler.Dispose()
ou enveloppez-le constructeur dans unusing
). À l'aide deIDisposable
sur votre les classes qui utilisent les ressources internes est fortement recommandé.De MSDN:
OriginalL'auteur Codesleuth
Non, de Disposer de méthodes ne sont pas une perte de temps.
Le modèle dispose est là pour permettre à un appelant de nettoyer une classe dès qu'ils ont fini avec elle, plutôt que d'attendre que le GC pour les recueillir. Le retard n'a pas beaucoup d'importance à la plaine de segment de mémoire, c'est pourquoi les classes de base comme
String
ne pas la mettre en œuvre. De quoi Disposer est utile, cependant, est de nettoyer non géré ressources. Quelque part en interne, la classe Dataset est à l'aide d'une ressource non managée, il offre une méthode dispose pour vous permettre de vous laisser savoir quand non gérés ressource peut être libéré.Si le modèle a été correctement suivies jeu de données sera également un finaliseur (ou une sous-classe), ce qui signifie que si vous n'avez pas l'éliminer manuellement, par la suite la GC, le finaliseur appelait et non managé des ressources serait nettoyée de cette façon. Cette ressource non managée qui pourrait être important si, imaginez si c'était un fichier de verrouillage, ou une connexion de base de données, vous ne voulez pas vraiment à accrocher autour d'attente pour la GC à exécuter avant que vous pouvez réutiliser votre connexion de base de données. Disposer fournit de façon déterministe de nettoyage de ressources quand ils sont finis plutôt que de compter sur la non-déterministe GC.
Comme pour les variables de réglage à la valeur null dans une méthode dispose. Presque tous les cas, il serait inutile. définition d'une variable à null supprime une référence à cette variable, ce qui va rendre admissibles pour la collecte des ordures (si c'est la dernière référence), mais comme vous êtes l'élimination de la classe de toute façon, vous êtes susceptible d'aller hors de la portée de la classe conteneur à l'intérieur de la classe deviendront admissibles à la collecte de toute façon.
Si vous avez des variables de membre à l'intérieur de votre classe qui sont jetables que vous avez créé (et pas seulement les références que vous tenez), alors vous devriez toujours faire appel à disposer sur eux à partir de votre propre classe de la méthode dispose, mais ne vous embêtez pas à les mettre à null.
OriginalL'auteur Simon P Stevens
Pas tout à fait. Si vous avez des variables membres qui sont jetables, vous devriez jeter comme ça. Votre objet peut vivre plus longtemps que l'étendue du travail qu'il fait que le garbage collector n'est pas garanti pour fonctionner à un moment donné.
Réglage de variables gérés à la valeur null est une perte de temps. L'objet ne sera pas obtenir GC avais plus rapidement.
OriginalL'auteur Jamie Penney
Camion poubelle vient de ma région, chaque semaine, mais il ne collectionne pas mes déchets, à moins que j'ai mis mes poubelles dans une façon que l'on peut recueillir.
Vous devez simplement supprimer tous les abonnements d'événements, de référence et de claire non géré gestionnaires. Puis ramasse-miettes de prendre soin de tout le reste.
Exemple ci-dessous montrent la meilleure pratique générale pour mettre en œuvre interface IDisposable. Référence : https://msdn.microsoft.com/en-us/library/system.idisposable.dispose(v=vs. 110).aspx
IDisposable
n'est pas de détruire les ressources--c'est à libération. Lorsqu'unFileStream
ouvre un fichier, il demande que l'OS empêcher quiconque d'utiliser le fichier jusqu'à nouvel avis; appelDispose
sur leFileStream
ne pas détruire le fichier--au contraire, le rend utilisable par d'autres entités. Le GC fonctionne sur le principe qu'il devrait y avoir aucun empressement à détruire les choses quand il y a de l'espace pour les tenir, mais une fois que le code a ne plus l'utiliser pour unFileStream
, il faut essayer de rendre le fichier à nouveau disponible pour d'autres dès que possible.Pas tout à fait sûr de ce que vous essayez de dire. Je suppose que FileStream Disposer ne relâchez le gestionnaire de fichier et laisser le garbage collector pour effacer les instances gérées. Son seul but si ce n'est pour le rendre utilisable pour les autres.Si vous n'ouvrez pas le fichier exclusivement, il peut être utiliser par d'autres de toute façon.
La raison GC seul n'est pas suffisant pour des choses comme
FileStream
n'est pas qu'ils toujours contient un fichier de verrouillage d'une manière qui interfère avec les autres entités qui en ont besoin pour utiliser le fichier, mais qu'ils parfois, et il est généralement plus facile de libérer des ressources lorsqu'elles ne sont plus nécessaires, sans se soucier de savoir si la contention serait existent réellement, que pour identifier les cas où la contention ne sont pas exister et à abandonner les ressources sans les relâcher dans de tels cas. Notez que le parfois n'a pas à être "très souvent" à faireIDisposable
la peine. Même si l'abandon d'un flux de fichier......de travail 99% du temps, il peut être plus facile d'avoir le code d'appel
Dispose
sur le flux de fichiers 100% du temps, quand ils ne sont plus nécessaires que le code qui en général ne dispose pas de travailler à 100% du temps.OriginalL'auteur CharithJ