Nettoyage de ressources non managées
Pour une majorité des objets créés par votre application, vous pouvez vous appuyer sur le garbage collector .NET pour gérer la gestion de la mémoire. Toutefois, lorsque vous créez des objets qui incluent des ressources non managées, vous devez libérer explicitement ces ressources lorsque vous avez terminé de les utiliser. Les types les plus courants de ressources non managées sont des objets qui encapsulent les ressources du système d’exploitation, telles que les fichiers, les fenêtres, les connexions réseau ou les connexions de base de données. Bien que le récupérateur de mémoire puisse assurer le suivi de la durée de vie d'un objet qui encapsule une ressource non managée, il ne sait pas comment libérer et nettoyer la ressource non managée.
Si vos types utilisent les ressources non managées, procédez comme suit :
Implémentez le modèle de suppression. Cela nécessite que vous fournissez une IDisposable.Dispose implémentation pour activer la mise en production déterministe des ressources non managées. Un consommateur de votre type appelle Dispose lorsque l’objet (et les ressources qu’il utilise) n’est plus nécessaire. La méthode Dispose libère immédiatement les ressources non managées.
Dans le cas où un consommateur de votre type oublie d’appeler Dispose, fournissez un moyen pour que vos ressources non managées soient libérées. Il existe deux façons d'effectuer cette opération :
Utilisez un handle sécurisé pour encapsuler votre ressource non managée. Il s’agit de la technique recommandée. Les handles sécurisés sont dérivés de la System.Runtime.InteropServices.SafeHandle classe abstraite et incluent une méthode robuste Finalize . Lorsque vous utilisez un handle sécurisé, implémentez simplement l'interface IDisposable et appelez la méthode Dispose de votre handle sécurisé dans l'implémentation de IDisposable.Dispose. Le finaliseur du handle sécurisé est appelé automatiquement par le récupérateur de mémoire si sa méthode Dispose n'est pas appelé.
— ou —
Définissez un finaliseur. La finalisation active la mise en production non déterministe des ressources non managées lorsque le consommateur d’un type n’appelle pas la méthode IDisposable.Dispose pour les supprimer de manière déterministe.
Avertissement
La finalisation de l’objet peut être une opération complexe et sujette aux erreurs, nous vous recommandons d’utiliser un handle sécurisé au lieu de fournir votre propre finaliseur.
Les consommateurs de votre type peuvent ensuite appeler directement votre implémentation de IDisposable.Dispose pour libérer la mémoire utilisée par les ressources non managées. Lorsque vous implémentez correctement une méthode Dispose, la méthode Finalize de votre handle sécurisé ou votre propre substitution de la méthode Object.Finalize devient un dispositif de protection pour nettoyer les ressources si la méthode Dispose n'est pas appelée.
Contenu de cette section
L’implémentation d’une méthode Dispose décrit comment implémenter le modèle de suppression pour libérer des ressources non managées.
Utilisation d’objets qui implémentent IDisposable
décrit comment les consommateurs d’un type garantissent que son Dispose implémentation est appelée. Nous vous recommandons vivement d’utiliser l’instruction C# using
(ou Visual Basic Using
) pour ce faire.
Référence
Type / Membre | Description |
---|---|
System.IDisposable | Définit la méthode Dispose pour libérer des ressources non managées. |
Object.Finalize | Prévoit la finalisation de l’objet si les ressources non managées ne sont pas libérées par la méthode Dispose. |
GC.SuppressFinalize | Supprime la finalisation. Cette méthode est généralement appelée à partir d'une méthode Dispose pour empêcher un finaliseur de s'exécuter. |