Sobes.tech
Middle

Čo je rozhranie IDisposable a na čo sa v C# používa?

sobes.tech AI

Odpoveď od AI

IDisposable — rozhranie, ktoré poskytuje mechanizmus na uvoľnenie neovládaných zdrojov. Obsahuje metódu Dispose().

Používa sa na:

  • Uvoľnenie neovládaných zdrojov: ako sú deskriptory súborov, pripojenia k databázam, sieťové sokety. .NET tieto zdroje nedokáže automaticky spravovať.
  • Čistenie po použití: zabezpečuje, že objekty, ktoré spotrebúvajú veľa zdrojov, budú správne uvoľnené, aj keď dôjde k výnimkám.
  • Použitie s operátorom using: operátor using automaticky zavolá metódu Dispose() pri ukončení bloku kódu, aj keď dôjde k výnimke. Toto je preferovaný spôsob používania objektov, ktoré implementujú IDisposable.

Príklad implementácie:

public class MyResource : IDisposable
{
    // Simulácia neovládaného zdroja
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Pridelenie neovládaného zdroja
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Metóda Dispose z rozhrania IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Potlačenie finalizácie, pretože zdroje sú už uvoľnené
        GC.SuppressFinalize(this);
    }

    // Virtuálna metóda na implementáciu logiky uvoľnenia
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Uvoľnenie spravovaných zdrojov, ak existujú
                // ...
            }

            // Uvoľnenie neovládaných zdrojov
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizátor (destruktor) na uvoľnenie zdrojov, ak `Dispose` nebol explicitne volaný
    ~MyResource()
    {
        Dispose(false);
    }
}

Príklad použitia s using:

using (var resource = new MyResource())
{
    // Práca so zdrojom
    // ...
} // `Dispose()` sa automaticky zavolá pri opustení bloku `using`