تُعدّ واجهة IDisposable محورية في تنظيف الموارد، ولها دوران مهمان في C#:
Dispose()) بأنه لم تعد هناك حاجة إليه، ليتسنّى له تحرير أي موارد غير مُدارة أو إعادة ضبط حالته الداخلية على النحو المناسب. ويُقابل هذا النهج المعتاد في التنظيف، وهو ترك جامع القمامة ينظّف كل شيء (وبالأساس تحرير الذاكرة).IDisposable جملة using التي نوقشت في تمرين resource-lifetime.من الممكن، وإن كان ذلك غير مرجّح، أن يُستدعى Dispose() عبر الواجهة في نوع ما من روتينات التنظيف العامة.
تُصادَف واجهة IDisposable في الغالب مع أصناف المكتبات التي تغلّف موارد نظام التشغيل (غير المُدارة) مثل System.IO.Stream وSystem.IO.TextReader. (تُغطّى أنواع Stream وTextReader في تمارين أخرى).
public class TextHandler : IDispoable
{
private TextReader reader = new TextReader(...);
public void Dispose()
{
reader.Dispose();
}
}
إذا كان الصنف الذي تستخدمه يُنفّذ واجهة IDispoable فيجب أن تضمن استدعاء Dispose() (باستخدام جملتي catch وfinally) عندما لا تعود هناك حاجة إلى النسخة. وإذا كان لصنف ما عضو يُنفّذ IDisposable فمن المرجّح أنه يحتاج بدوره إلى تنفيذ IDisposable حتى يمكن استدعاء Dispose() للتخلص من العضو الذي يُنفّذ IDisposble.
public class Activity : IDisposable
{
private MyResource myResource;
public Activity()
{
myResource = new MyResource();
}
public void Perform()
{
try
{
myResource.BeUseful();
}
catch (Exception)
{
myResource.Dispose();
}
}
public void Dispose()
{
myResource.Dispose();
}
}
قد تكون واجهة IDisposable مفيدة حتى عندما لا تكون هناك موارد غير مُدارة في المعادلة. لنفترض أن لديك كائنًا طويل العمر يتطلّب أن تسجّل كائنات قصيرة العمر نفسها لديه ثم تلغي تسجيلها عندما لا تعود هناك حاجة إليها. إن تنفيذ IDisposable في الكائن قصير العمر يُنبّه المطوّر الذي يستخدم ذلك الصنف إلى ضرورة استدعاء Dispose() عند نهاية عمر الكائن قصير العمر.
سترى إشارات في التوثيق إلى نمط التخلص. يتضمّن نمط التخلص استدعاء Dispose() من المُنهي الخاص بالصنف، وضمان التعامل الصحيح مع التخلص من الموارد في الأصناف الأساسية. وسيُتناول نمط التخلص في تمرين لاحق.
يتعلّق نمط التخلص في معظمه بالموارد غير المُدارة. إذا كنت تستخدم آلية P/Invoke وطرق extern فأنت بحاجة إلى فهم كيفية تنفيذ نمط التخلص ومتى. وقليلًا ما يضطر معظم مطوري C# إلى التعامل مباشرة مع الموارد غير المُدارة بهذه الكيفية.