Sobes.tech
Middle

Qu'est-ce que l'interface IDisposable et à quoi sert-elle en C#?

sobes.tech IA

Réponse de l'IA

IDisposable — c'est une interface qui fournit un mécanisme pour libérer des ressources non gérées. Elle contient une méthode Dispose().

Elle est utilisée pour :

  • Libérer des ressources non gérées : telles que des descripteurs de fichiers, des connexions à des bases de données, des sockets réseau. .NET ne peut pas gérer automatiquement ces ressources.
  • Nettoyage après utilisation : garantit que les objets gourmands en ressources sont correctement libérés, même en cas d'exception.
  • Utilisation avec l'opérateur using : l'opérateur using appelle automatiquement la méthode Dispose() à la fin du bloc de code, même si une exception se produit. C'est la façon préférée d'utiliser des objets qui implémentent IDisposable.

Exemple d'implémentation :

public class MyResource : IDisposable
{
    // Simulation d'une ressource non gérée
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Allocation d'une ressource non gérée
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Méthode Dispose de l'interface IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Annuler la finalisation, car les ressources sont déjà libérées
        GC.SuppressFinalize(this);
    }

    // Méthode virtuelle pour implémenter la logique de libération
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Libérer les ressources gérées, si elles existent
                // ...
            }

            // Libérer les ressources non gérées
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finaliseur (destructeur) pour libérer les ressources si Dispose n'a pas été appelé explicitement
    ~MyResource()
    {
        Dispose(false);
    }
}

Exemple d'utilisation avec using :

using (var resource = new MyResource())
{
    // Travail avec la ressource
    // ...
} // Dispose() est appelé automatiquement à la sortie du bloc using