C#. Obyektlarni tozalash(IDisposable)

C#. Obyektlarni tozalash(IDisposable)

C#. Obyektlarni tozalash(IDisposable)

.Net muhitida axlat tozalovchi qurilmasi(garbage collector, GC) juda aqlli va kerakli hollarda ishonchli xizmat qiladi. U avtomat o’zi ishlaydi va biron bir obyekt ishlatilinib bo’lingandan so’ng dasturchini o’zi xotirada tozalashi shart emas, .Net muhiti dasturchi uchun uning o’rniga bu ishni a’lo darajada bajaradi.

Lekin shuni ta’kidlab o’tish kerakki, turlar boshqarilishga ko’ra ikki xil bo’ladi: boshqariladigan va boshqarilmaydigan. Boshqariladigan turlar new operatori bilan aniqlanadi va xotiraning dinamik boshqariladigan qismida saqlanadi. Va u ishlatilinib bo’lingandan so’ng, axlat tozalovchi tomonidan avtomatik o’chirilib, resurs bo’shatilinadi. Boshqarilmaydigan resurslar odatda «qimmatli element» bo’lib, ularni ishlatib bo’lingandan so’ng qanchalik tez xotiradan o’chirilsa, shuncha dasturni ishlash unumdorligi yuqori bo’ladi. Ularning misol qilib, ma’lumotlar ombori bilan bog’lanish, fayllar bilan ishlash, har xil qurilmalar bilan bog’lanish va ma’lumot almashinishlarni keltirish mumkin.

Shunday holatlar bo’ladi, boshqarilmaydigan tiplarda yoki resurslarda aloqa(connection) ma’lum bir qurilma xatosi tufayli yoki boshqa kutilmagan muommolar tufayli ochiq qolib ketishi mumkin. Va bunda axlat tozalovchi bu «resurs foydalanilyapti» deb hisoblab, uni xotiradan tozalab tashlamasligi yoki bo’lmasam bu resurs uning navbatida qolib ketishi mumkin. Ammo dastur bu qismdan o’tib, ishlashda davom etaveradi yoki bu ma’lumotlarsiz ham ishlashi mumkin bo’ladi. Natijada, xotira keraksiz ma’lumotlar bilan to’lib, muhim resurslar band bo’lib qolaveradi. Bu esa dasturni ishlash tezligiga, uning unumdorligiga to’g’ridan-to’g’ri salbiy ta’sir ko’rsatadi. Buni oldini olish uchun dasturchi qandaydir holatlar, shartlarda ushbu keraksiz resurslarni «qo’lda» o’zi tozalashi kerak bo’ladi.

Demak ularni qanchalik tez tozalasak shuncha foydali(albatta ular o’z vazifasini bajarib bo’lganidan so’ng). Buning uchun
IDisposable interfeysini yagona metodi bo’lgan Dispose() foydalanishimiz mumkin.

public interface IDisposable
{
  void Dispose();
}

Klassimiz ushbu interfeysni qo’llashini bajarganimizda, obyekt o’z «ishini» bajarib bo’lingandan so’ng, interfeysni yagona metodi dasturchi tomonidan chaqiriladi deb hisoblanadi. Bu esa, axlat tozalovchi o’z vazifasini bajarishini kutmasdan turib bemalol ishlatilinib bo’lingan resurslardan dasturni tozalash imkonini beradi.

IDisposable ham klassda, ham strukturada bajarilishi mumkin, chunki Dispose() metodi obyektni ishlatayotgan dasturchi tomonidan chaqiriladi.

class MyResource : IDisposable
{
    Connectin1 connect1;
    Connectin2 connect2;
    bool isDisposed = false;
    public MyResource()
    {
        connect1 = Connectin1();  //masalan ma'lumotlar ombori bilan bog'lanish
        connect2 = Connectin2();  //masalan biron bir qurilma bilan bog'lanish
    }
    public void AnyAction()
    {
        if (isDisposed) // o'chirilgan obyektni ishlatish - yaxshisi uni tekshirib qo'ygan yaxshi
            throw new ObjectDisposedException("O'chirilgan MyResource obyekti ishlatilinyapti");
        // ...
    }
    public void Dispose()
    {
        if (isDisposed)
            return;
        connect1.Dispose();
        connect2.Dispose();
        isDisposed = true;
    }
}

Bu klassni qo’llanilishi quyidagicha:

MyResource resource = new MyResource();
//qandaydir amallar...
resource.Dispose();

Umumiy Dasturlash
C#. Obyektlarni tozalash(IDisposable)