Nettoyage de ressources non managéesCleaning Up Unmanaged Resources

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.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. 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 dans votre application.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. 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.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. 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.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Si vos types utilisent les ressources non managées, procédez comme suit :If your types use unmanaged resources, you should do the following:

  • Implémentez le modèle de suppression.Implement the dispose pattern. Pour ce faire, vous devez fournir une implémentation de IDisposable.Dispose pour activer la version déterministe des ressources non managées.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Un consommateur de votre type appelle la méthode Dispose lorsque l'objet (et les ressources qu'il utilise) n'est plus nécessaire.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. La méthode Dispose libère immédiatement les ressources non managées.The Dispose method immediately releases the unmanaged resources.

  • Prévoyez que vos ressources non managées soient libérées si un consommateur de votre type oublie d'appeler la méthode Dispose.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Il existe deux façons d'effectuer cette opération :There are two ways to do this:

    • Utilisez un handle sécurisé pour encapsuler votre ressource non managée.Use a safe handle to wrap your unmanaged resource. Il s'agit de la technique recommandée.This is the recommended technique. Les handles sécurisés sont dérivés de la classe System.Runtime.InteropServices.SafeHandle et incluent une méthode Finalize fiable.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. 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.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. 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é.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      - ou -—or—

    • Remplacez la méthode Object.Finalize.Override the Object.Finalize method. La finalisation active la version 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.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. Toutefois, comme 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.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

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.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. 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.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

Dans cette sectionIn This Section

Implémentation d’une méthode DisposeImplementing a Dispose Method
Explique comment implémenter le modèle de suppression pour libérer les ressources non managées.Describes how to implement the dispose pattern for releasing unmanaged resources.

Utilisation d’objets implémentant IDisposableUsing Objects That Implement IDisposable
Décrit comment les consommateurs d'un type vérifient que son implémentation de Dispose est appelée.Describes how consumers of a type ensure that its Dispose implementation is called. Pour ce faire, nous vous recommandons d'utiliser l'instruction using en C# ou l'instruction Using en Visual Basic.We recommend using the C# using statement or the Visual Basic Using statement to do this.

RéférenceReference

System.IDisposable
Définit la méthode Dispose pour libérer des ressources non managées.Defines the Dispose method for releasing unmanaged resources.

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.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Supprime la finalisation.Suppresses finalization. Cette méthode est généralement appelée à partir d'une méthode Dispose pour empêcher un finaliseur de s'exécuter.This method is customarily called from a Dispose method to prevent a finalizer from executing.