Sobes.tech
Middle

Ce este interfața IDisposable și pentru ce este utilizată în C#?

sobes.tech AI

Răspuns de la AI

IDisposable — este o interfață care oferă un mecanism pentru eliberarea resurselor necontrolate. Conține o metodă Dispose().

Este utilizată pentru:

  • Eliberarea resurselor necontrolate: precum descriptorii de fișiere, conexiunile la baze de date, socket-urile de rețea. .NET nu poate gestiona automat aceste resurse.
  • Curățarea după utilizare: asigură că obiectele care consumă multe resurse sunt eliberate corect, chiar dacă apar excepții.
  • Utilizarea împreună cu operatorul using: operatorul using apelează automat metoda Dispose() la ieșirea din blocul de cod, chiar dacă apare o excepție. Este modul preferat de a utiliza obiecte care implementează IDisposable.

Exemplu de implementare:

public class MyResource : IDisposable
{
    // Simulare resurs necontrolat
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Alocare resursă necontrolată
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Metoda `Dispose` din interfața `IDisposable`
    public void Dispose()
    {
        Dispose(true);
        // Anulare finalizare, deoarece resursele sunt deja eliberate
        GC.SuppressFinalize(this);
    }

    // Metodă virtuală pentru implementarea logicii de eliberare
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Eliberare resurse gestionate, dacă există
                // ...
            }

            // Eliberare resurse necontrolate
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizator (destructor) pentru eliberarea resurselor dacă `Dispose` nu a fost apelat explicit
    ~MyResource()
    {
        Dispose(false);
    }
}

Exemplu de utilizare cu using:

using (var resource = new MyResource())
{
    // Lucru cu resursa
    // ...
} // `Dispose()` este apelat automat la ieșirea din blocul `using`