Sobes.tech
Middle

IDisposable interfeysi nima va u C# da nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

IDisposable — buqalamagan resurslarni ozod qilish mexanizmini ta'minlaydigan interfeys. U Dispose() metodini o'z ichiga oladi.

U quyidagilar uchun ishlatiladi:

  • Nazoratsiz resurslarni ozod qilish: masalan, fayl deskriptorlari, ma'lumotlar bazasi ulanishlari, tarmoq soketlari. .NET bu resurslarni avtomatik boshqarolmaydi.
  • Foydalanishdan so'ng tozalash: bu resursga og'ir ob'ektlar to'g'ri ozod qilinishini ta'minlaydi, hatto istisnolar yuzaga kelsa ham.
  • using operatori bilan birga ishlatish: using operatori kod blokidan chiqishda Dispose() metodini avtomatik chaqiradi, hatto istisno yuzaga kelsa ham. Bu IDisposable ni amalga oshirgan obyektlarni ishlatish uchun afzal usul.

Implementatsiya misoli:

public class MyResource : IDisposable
{
    // Nazorat qilinmaydigan resursni taqlid qilish
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Nazorat qilinmaydigan resursni ajratish
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // `IDisposable` interfeysidan `Dispose()` metodi
    public void Dispose()
    {
        Dispose(true);
        // Finalizatsiyani oldini olish, chunki resurslar allaqachon ozod qilindi
        GC.SuppressFinalize(this);
    }

    // Resurslarni ozod qilish logikasini amalga oshirish uchun virtual metod
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Boshqariladigan resurslarni ozod qilish, agar mavjud bo'lsa
                // ...
            }

            // Nazorat qilinmaydigan resurslarni ozod qilish
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizator (destruktor) `Dispose()` chaqirilmagan taqdirda resurslarni ozod qilish uchun
    ~MyResource()
    {
        Dispose(false);
    }
}

using bilan ishlatish misoli:

using (var resource = new MyResource())
{
    // Resurs bilan ishlash
    // ...
} // `Dispose()` avtomatik chaqiriladi, `using` blokidan chiqishda