Sobes.tech
Middle

IDisposable interfeysi nədir və C#-də nə üçün istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

IDisposable — idarə olunmayan resursların azad olunması mexanizmini təmin edən interfeysdir. O, Dispose() metodunu ehtiva edir.

O, aşağıdakı üçün istifadə olunur:

  • İdarə olunmayan resursların azad olunması: fayl deskriptorları, verilənlər bazası əlaqələri, şəbəkə soketləri kimi. .NET bu resursları avtomatik idarə edə bilməz.
  • İstifadədən sonra təmizləmə: resursdan çox istifadə edən obyektlərin düzgün şəkildə azad olunmasını təmin edir, hətta istisnalar baş verərsə belə.
  • using operatoru ilə birlikdə istifadə: using operatoru kod blokundan çıxarkən Dispose() metodunu avtomatik çağırır, hətta istisna baş verərsə belə. Bu, IDisposable-i həyata keçirən obyektlərin istifadə olunması üçün üstün yoldur.

İcrası nümunəsi:

public class MyResource : IDisposable
{
    // İdarə olunmayan resursun simulasyonu
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // İdarə olunmayan resursun ayrılması
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` interfeysindən `Dispose()` metodu
    public void Dispose()
    {
        Dispose(true);
        // Finalizasiyanı ləğv et, çünki resurslar artıq azad olunub
        GC.SuppressFinalize(this);
    }

    // Resursların azad olunması üçün virtual metod
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // İdarə olunan resursların azad olunması, varsa
                // ...
            }

            // İdarə olunmayan resursların azad olunması
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // `Dispose` çağırılmadıqda resursları azad etmək üçün finalizator (destruktor)
    ~MyResource()
    {
        Dispose(false);
    }
}

using ilə istifadə nümunəsi:

using (var resource = new MyResource())
{
    // Resursla işləmək
    // ...
} // `Dispose()` avtomatik çağırılır, `using` blokundan çıxarkən