Sobes.tech
Middle

Τι είναι η διεπαφή IDisposable και πού χρησιμοποιείται στη C#;

sobes.tech AI

Απάντηση από AI

IDisposable — bu, idarə olunmayan resursların sərbəst buraxılması mexanizmini təmin edən interfeysdir. O, Dispose() metodunu ehtiva edir.

O, aşağıdakı məqsədlər üçün istifadə olunur:

  • İdarə olunmayan resursların sərbəst buraxılması: 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ə sərbəst buraxılması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