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 ইমপ্লিমেন্ট করে, তাহলে IDisposble ইমপ্লিমেন্ট করা ওই মেম্বারটিকে ডিসপোজ করার জন্য Dispose() কল করা যাতে সম্ভব হয়, সেজন্য ক্লাসটিকে নিজেই IDisposable ইমপ্লিমেন্ট করতে হতে পারে।
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/Inovke মেকানিজম ও extern মেথড ব্যবহার করেন, তাহলে ডিসপোজ প্যাটার্ন কীভাবে আর কখন ইমপ্লিমেন্ট করতে হয় তা বুঝতে হবে। বেশিরভাগ C# ডেভেলপারকে এইভাবে সরাসরি আনম্যানেজড রিসোর্স নিয়ে কাজ করতে হয় খুব কমই।