Sobes.tech
Middle

Mis on IDisposable liides ja milleks seda C#-s kasutatakse?

sobes.tech AI

Vastus AI-lt

IDisposable — see liides pakub mehhanismi haldamata ressursside vabastamiseks. See sisaldab ühte meetodit Dispose():

Kasutatakse:

  • Haldamata ressursside vabastamiseks: näiteks failide deskriptorid, andmebaasi ühendused, võrgusoketid. .NET ei halda neid ressursse automaatselt.
  • Pärast kasutamist puhastamiseks: tagab, et ressursimahukad objektid vabastatakse korrektselt, isegi kui tekib erandid.
  • Koos using operaatoriga: using operaator kutsub automaatselt välja Dispose() meetodi, kui koodiplokk lõpeb, isegi kui tekib erand. See on soovitatav viis IDisposable-i realiseerivate objektide kasutamiseks.

Näide realiseerimisest:

public class MyResource : IDisposable
{
    // Imiteerib haldamata ressurssi
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Haldamata ressursi eraldamine
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` liidese `Dispose()` meetod
    public void Dispose()
    {
        Dispose(true);
        // Finaliseerimise vältimine, kuna ressursid on juba vabastatud
        GC.SuppressFinalize(this);
    }

    // Virtuaalne meetod ressursside vabastamiseks
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Hallatavate ressursside vabastamine, kui on
                // ...
            }

            // Haldamata ressursside vabastamine
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finaliseerija (destruktor), kui `Dispose` ei ole otseselt kutsutud
    ~MyResource()
    {
        Dispose(false);
    }
}

Näide kasutamisest using-iga:

using (var resource = new MyResource())
{
    // Ressursiga töötamine
    // ...
} // `Dispose()` kutsutakse automaatselt välja, kui väljutakse `using`-ist