2009-01-31 9 views

Répondre

2

Si votre implémentation est en mode boîte blanche, l'appel à Fermer sur le flux de fichiers doit fermer le flux mémoire.

Si la classe implémente IDisposable il suffit d'utiliser le bloc en utilisant si en C# de sorte que la ressource sera éliminé:

using (var foo = new Foo()) 
{ 
    // Do some stuff to foo 
} 

Si vous écrivez une enveloppe qui consommera la mémoire intensive alors je recommande la mise en œuvre IDisposable.

+0

Que se passe-t-il si le code à l'intérieur du bloc using génère une exception? – MichaelD

+0

En utilisant le bloc using, vous vous assurez que la ressource sera éliminée, même si une exception se produit dans le bloc using. – Llyle

+0

Le bloc using est traduit par le compilateur dans un bloc try..finally avec un appel à foo.Dispose() dans le dernier. De cette façon, le compilateur garantit que Dispose sera appelé même si votre code génère une exception. –

1

Suivez ces règles de pouce

1 - Où que possible, l'utilisation à l'aide pour vous assurer d'éliminer de manière appropriée des objets (en particulier lorsque vous travaillez avec des ruisseaux et tous). Vous pouvez appliquer « l'aide » pour éliminer toute IDisposable

using (SteramReader reader=new StreamReader(filePath)) 
{ 
    //Do your stuff here 
} 

Quand vous utilisez les flux, Close sera appelé automatiquement.


2 - Si vous n'utilisez pas les composants gérés, assurez-vous que vous les nettoyer lorsque vous r objets seront disposés ou lorsque vos formulaires se fermer


3 - Si vous utilisez trop beaucoup sérialisation XML, assurez-vous d'utiliser les constructeurs appropriés, sinon il peut causer une fuite de mémoire - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx


4 - Laissez tout le reste à la poubelle Collecto r

1

Si vous écrivez la classe qui fait référence à des fichiers/images, il est de votre responsabilité de fournir un mécanisme pour leur publication.

Pour toutes les applications .NET (pas seulement WinForms), implémenter IDisposable sur tout type qui contient des références à de grandes ressources de fichiers/mémoire est toujours un bon début.

Si vous utilisez des types de framework qui accèdent aux ressources, alors comme d'autres l'ont dit, les blocs using sont une solution élégante.

Il est également possible de forcer le garbage collector à disposer des types au moment où vous le demandez (déterministe), mais il est fortement recommandé de ne pas le faire et de permettre au garbage collector de décider lui-même à la fois pour améliorer les performances et la gestion de la mémoire.

Enfin, parce que l'appel de Dispose (directement ou via l'utilisation) est fait par l'utilisateur de vos types, il est essentiel de documenter clairement cela (commentaires XML, etc.).

Voir cette earlier SO question pour beaucoup plus de détails

+0

Oui, je suis particulièrement intéressé par le nettoyage de mes propres références. – MichaelD

0

1.-Interface de mise en œuvre IDisposable vous aidera avec les ressources non gérées. 2.- si vous accédez par programme à des fichiers en cas d'erreur essayez de fermer() les fichiers ou les flux dans une instruction try {} catch {} finally pour éviter les verrous sur cette ressource 3. le garbage collector prendra le plus de ressources des heures

Questions connexes