Sobes.tech
Middle

Mi az az IDisposable felület és mire használják C#-ban?

sobes.tech MI

Válasz az MI-től

IDisposable — ez egy interfész, amely egy nem kezelt erőforrás felszabadítási mechanizmust biztosít. Tartalmaz egy Dispose() metódust.

Ezt a következők céljából használják:

  • Nem kezelt erőforrások felszabadítása: például fájldeskriptorok, adatbázis-kapcsolatok, hálózati socketek. .NET nem tudja ezeket az erőforrásokat automatikusan kezelni.
  • Használat utáni tisztítás: biztosítja, hogy az erőforrás-igényes objektumok helyesen legyenek felszabadítva, még kivételek esetén is.
  • using operátorral való együttműködés: a using operátor automatikusan meghívja a Dispose() metódust a kódblokk végén, még kivétel esetén is. Ez az előnyösebb módja az IDisposable-t megvalósító objektumok használatának.

Implementációs példa:

public class MyResource : IDisposable
{
    // Nem kezelt erőforrás szimulációja
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Nem kezelt erőforrás lefoglalása
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` interfész `Dispose()` metódusa
    public void Dispose()
    {
        Dispose(true);
        // Finalizálás elnyomása, mivel az erőforrások már felszabadultak
        GC.SuppressFinalize(this);
    }

    // Virtuális metódus a felszabadítási logika megvalósításához
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Kezelt erőforrások felszabadítása, ha vannak
                // ...
            }

            // Nem kezelt erőforrások felszabadítása
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizátor (destruktor), ha a `Dispose` nem lett explicit meghívva
    ~MyResource()
    {
        Dispose(false);
    }
}

using-gal való használat példa:

using (var resource = new MyResource())
{
    // Erőforrás használata
    // ...
} // A `Dispose()` automatikusan meghívódik a `using` blokk végén