تكرار السؤال: …
الإجابة المختصرة
الموارد المدارة يتحكم بها الـ CLR تلقائياً، بينما غير المدارة (مثل مقابض ملفات نظام التشغيل ومقابس الشبكة) تتطلب تحريراً صريحاً عبر IDisposable ودالة Dispose().
الشرح
الـ Garbage Collector لا يعلم متى وكيف يغلق مقبض ملف لنظام التشغيل أو اتصال قاعدة بيانات مغلق. تطبيق واجهة IDisposable يتيح استخدام كتلة using (أو using declaration) لضمان استدعاء Dispose() فور الخروج من النطاق. نمط Dispose(bool disposing) المتقدم يحمي الموارد غير المدارة عبر Finalizer (~Class()) كملاذ أخير في حال نسيان المطور استدعاء Dispose().
مثال بالكود
public class ResourceHolder : IDisposable {
private bool _disposed;
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this); // إلغاء الـ Finalizer لتوفير موارد الـ GC
}
protected virtual void Dispose(bool disposing) {
if (!_disposed) {
if (disposing) { /* تحرير الموارد المدارة */ }
/* تحرير الموارد غير المدارة */
_disposed = true;
}
}
}أخطاء شائعة
- نسيان استدعاء GC.SuppressFinalize(this) داخل Dispose() مما يجبر الـ GC على إبقاء الكائن لدورة تنظيف إضافية غير ضرورية.