Sobes.tech
Middle

Co je to rozhraní IDisposable a k čemu se v C# používá?

sobes.tech AI

Odpověď od AI

IDisposable — je rozhraní, které poskytuje mechanismus pro uvolnění neřízených zdrojů. Obsahuje metodu Dispose().

Používá se pro:

  • Uvolnění neřízených zdrojů: jako jsou souborové deskriptory, připojení k databázím, síťové sokety. .NET tyto zdroje neumí automaticky spravovat.
  • Čištění po použití: zajišťuje, že objekty, které spotřebovávají hodně zdrojů, budou správně uvolněny, i když dojde k výjimkám.
  • Spolu s operátorem using: operátor using automaticky zavolá metodu Dispose() po ukončení bloku kódu, i když dojde k výjimce. Toto je preferovaný způsob používání objektů, které implementují IDisposable.

Příklad implementace:

public class MyResource : IDisposable
{
    // Simulace neřízeného zdroje
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Přidělení neřízeného zdroje
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Metoda Dispose z rozhraní IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Potlačení finalizace, protože zdroje jsou již uvolněny
        GC.SuppressFinalize(this);
    }

    // Virtuální metoda pro implementaci logiky uvolnění
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Uvolnění řízených zdrojů, pokud existují
                // ...
            }

            // Uvolnění neřízených zdrojů
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizátor (destruktor) pro uvolnění zdrojů, pokud nebyl explicitně volán `Dispose`
    ~MyResource()
    {
        Dispose(false);
    }
}

Příklad použití s using:

using (var resource = new MyResource())
{
    // Práce s prostředkem
    // ...
} // `Dispose()` je voláno automaticky při opuštění bloku `using`