Sobes.tech
Middle

Kas yra IDisposable sąsaja ir kam ji naudojama C#?

sobes.tech AI

Atsakymas iš AI

IDisposable — tai interfeisas, kuris suteikia mechanizmą išlaisvinti valdomus ir nevaldomus išteklius. Jis turi vieną metodą Dispose():

Naudojamas:

  • Nevaldomų išteklių išlaisvinimui: pvz., failų deskriptoriai, duomenų bazės ryšiai, tinklo lizdai. .NET automatiškai nevaldo šių išteklių.
  • Po naudojimo valymui: užtikrina, kad išteklių turintys objektai būtų tinkamai išlaisvinti, net jei įvyksta išimtys.
  • Naudojant kartu su using operatoriumi: using operatorius automatiškai iškviečia Dispose() metodą, kai baigiasi kodo blokas, net jei įvyksta išimtis. Tai yra pageidaujamas būdas naudoti IDisposable įgyvendančius objektus.

Pavyzdys:

public class MyResource : IDisposable
{
    // Imituojamas nevaldomas išteklius
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Nevaldomo ištekliaus paskyrimas
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` metodo `Dispose()` įgyvendinimas
    public void Dispose()
    {
        Dispose(true);
        // Finalizacijos atšaukimas, nes ištekliai jau išlaisvinti
        GC.SuppressFinalize(this);
    }

    // Vartotojo metodas, skirtas išlaisvinti išteklius
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Valdomų išteklių išlaisvinimas, jei yra
                // ...
            }

            // Nevaldomų išteklių išlaisvinimas
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizatorius (destruktorius), jei `Dispose` nebuvo iškviestas
    ~MyResource()
    {
        Dispose(false);
    }
}

Naudojimas su using:

using (var resource = new MyResource())
{
    // Darbas su ištekliu
    // ...
} // `Dispose()` bus iškviestas automatiškai, išeinant iš `using` bloko