Sobes.tech
Middle

Kas ir interfeiss IDisposable un kam tas tiek izmantojams C#?

sobes.tech AI

Atbilde no AI

IDisposable — tas irerfeiss, kas nodrošina nevaldītu resursu atbrīvošanas mehānismu. Tas satur vienu metodi Dispose():

Izmanto:

  • Nevaldītu resursu atbrīvošanai: piemēram, failu deskriptorus, datu bāzes savienojumus, tīkla soketus. .NET automātiski nenodrošina šo resursu pārvaldību.
  • Pēc lietošanas tīrīšanai: nodrošina, ka resursu smagie objekti tiks pareizi atbrīvoti, pat ja notiek izņēmumi.
  • Koplietojot ar using operatoru: using operators automātiski izsauc Dispose() metodi, kad beidzas koda bloks, pat ja notiek izņēmums. Tas ir ieteicamākais veids, kā izmantot IDisposable realizējošus objektus.

Piemērs realizācijai:

public class MyResource : IDisposable
{
    // Imite nevaldītu resursu
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Nevaldīta resursa piešķiršana
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` interfeisa `Dispose()` metode
    public void Dispose()
    {
        Dispose(true);
        // Finalizācijas atcelšana, jo resursi jau ir atbrīvoti
        GC.SuppressFinalize(this);
    }

    // Visiens metode resursu atbrīvošanai
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Pārvaldītu resursu atbrīvošana, ja ir
                // ...
            }

            // Nevaldītu resursu atbrīvošana
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizators (desturktors), ja `Dispose` nav izsaukts
    ~MyResource()
    {
        Dispose(false);
    }
}

using piemērs:

using (var resource = new MyResource())
{
    // Darbs ar resursu
    // ...
} // `Dispose()` automātiski izsauksies, izejot no `using` bloka