scénario: strong> p>
Une application instanible une seule instance d'une classe qui implémente Comment critique est-ce que le J'ai toujours cru que dans la plupart des scénarios comme celle-ci, il n'est pas nécessaire d'appeler Idisposable code>. L'instance est exposée via un élément statique qui le rend accessible à toutes les parties de l'application. L'instance unique doit être conservée en vie pour la durée de vie de l'application. P>
Dispose la méthode code> est appelé avant que l'application s'arrête et que le processus se termine? P>
Disposer code> car la résiliation du processus nettoie naturellement les ressources. Je me trompe? P>
3 Réponses :
Ce message a une explication détaillée sur la raison pour laquelle l'élimination de l'événement pub D'autres sont une bonne pratique p>
événements d'objet .NET et disposer / gc p>
Comme il y a des cas d'angle où GC ne collectionnera pas l'éditeur et continuera à tirer des événements même après la mise à jour de NULL. P>
La terminaison de processus supprime tout. Le GC n'a pas d'importance à ce stade.
Si par "Votre application s'arrête", vous voulez dire que le processus est terminé, alors vous techniquement em> n'a pas besoin de faire quoi que ce soit. Votre processus est terminé et le système d'exploitation va libérer ces ressources. P>
J'imagine que leur peut être des cas d'angle obscurs où certains composants pouvaient créer un type de fichier ou autre ressource et si J'aimerais donner un exemple de cela, même s'il s'agit d'un cas d'angle bizarre. Disons que vous référence et utilisez un composant dans votre code. Lorsque vous créez et utilisez ceci, il crée un fichier de 2 Go sur votre machine. Maintenant, prenons une étape plus loin et disons que ce composant ferme la poignée de fichier lui-même accédant à ce fichier de 2 Go pendant son utilisation, en raison d'un bug ou d'une mauvaise conception. Maintenant, le QU'être dit - la meilleure pratique consiste à appeler disposer code> n'est pas appelé, qui ne sera pas nécessairement nettoyé, même si votre processus se termine. p>
Dispose code> sur cet objet nettoie ce fichier, mais il n'est pas bien documenté. Il manque essentiellement le Dispose de l'appel code> à cela laissera un fichier sur la machine. C'est définitivement un cas d'angle et ne fera rien de "fuir" votre machine, mais vous avez un fichier de 2 Go juste assis là. P>
Dispose code> lorsque vous avez déterminé de manière déterministe avec vos ressources. Vous pouvez appeler une méthode sur votre singleton - disons Nettoyage () code> - qui peut s'exécuter lorsque vous arrêtez. P>
J'ai marqué cela comme la réponse. Mon emporter est que la réponse est fondamentalement: "Cela dépend". Je suppose que la réponse dépend de la raison pour laquelle le type implémente Idisposable code> et quelles ressources il crée et ce qui ne serait pas nettoyé sans appeler la méthode Disposer code>. Certains cas comme les flux de fichiers ouverts sont automatiquement nettoyés par le système d'exploitation lorsque le processus se ferme. D'autres cas pourraient impliquer des scénarios qui laissent des ordures derrière même après la fin du processus si la méthode Dispose code> n'est pas appelée.
@usr Nettoyage des poignées et des fichiers sont deux choses différentes. OS nettoie également des fichiers si file_flag_delete_on_flose_delete_on_flose code> est défini lorsque le fichier est créé.
Si vous voulez vous assurer que votre méthode d'élimination est appelée et si ce n'est pas une situation de décès ou d'alive, vous pouvez vous attacher à Si vous devez absolument vous assurer que les ressources sont nettoyées, utilisez une exécution d'une coque qui surveille votre exécutable principal et se nettoie après cela. P> AppDomain.CurrentDomaine.Processexit Code>. P>.
J'utilise exactement le même modèle avec API Revit. En ce moment, je me désabonne aux événements et je dispose de la classe sur demande. Je ne sais pas si cela est nécessaire.