Nettoyage de ressources non managées

Pour la majorité des objets créés par votre application, vous pouvez laisser au Garbage collector .NET le soin de gérer les tâches de gestion de mémoire. Lorsque vous créez des objets qui incluent des ressources non managées, vous devez libérer explicitement ces ressources lorsque vous avez fini 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 bases 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. Pour ce faire, vous devez fournir une implémentation de IDisposable.Dispose pour activer la version déterministe des ressources non managées. Un consommateur de votre type appelle la méthode 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 de libérer vos ressources non managé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 classe abstraite System.Runtime.InteropServices.SafeHandle et incluent une méthode Finalize fiable. 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 s’avérer être une opération complexe et susceptible d’engendrer des 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

Implémentation d’une méthode Dispose Explique comment implémenter le modèle de suppression pour libérer les ressources non managées.

Utilisation d’objets implémentant IDisposableIDisposable Décrit comment les consommateurs d’un type vérifient que son implémentation Dispose est appelée. Pour ce faire, nous vous recommandons fortement d’utiliser using en C# (ou Using en Visual Basic).

Informations de 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.