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.
.NETbu 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.
usingoperatori bilan birga ishlatish:usingoperatori kod blokidan chiqishdaDispose()metodini avtomatik chaqiradi, hatto istisno yuzaga kelsa ham. BuIDisposableni 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