উত্তর: শুধু একটি
C#-এ একটি ক্লাসে সর্বোচ্চ একটি ডিস্ট্রাক্টর (ফাইনালাইজার) থাকতে পারে। একাধিক ডিক্লেয়ার করলে কম্পাইলার এরর দেবে।
ডিস্ট্রাক্টরের বৈশিষ্ট্য
- প্যারামিটার নেয় না
- টিল্ড (~) সিম্বল দিয়ে শুরু হয়:
~ClassName() - স্ট্রাক্ট (struct) এ ডিস্ট্রাক্টর ডিফাইন করা যায় না
- ম্যানুয়ালি কল করা যায় না — GC অটোমেটিক কল করে
- বেস ক্লাসের
Finalizeইনহেরিট করে (ইম্প্লিসিট্লি)
উদাহরণ
class Demo {
~Demo() { // ফাইনালাইজার
// ক্লিনআপ স্টেটমেন্ট...
Console.WriteLine("Destructor called");
}
}
class Program {
static void Main() {
Demo d = new Demo();
d = null;
GC.Collect(); // ফোর্সফুলি GC চালানো (ডেমোর জন্য)
GC.WaitForPendingFinalizers();
Console.ReadLine();
}
}
আউটপুট (সময়মতো):
Destructor called
ফাইনালাইজারের আন্ডারলাইং কোড
কম্পাইলার ডিস্ট্রাক্টরকে নিচের মতো রূপান্তর করে:
protected override void Finalize() {
try {
// ক্লিনআপ স্টেটমেন্ট...
}
finally {
base.Finalize();
}
}
একাধিক ডিস্ট্রাক্টর ডিক্লেয়ার করলে?
class Demo {
~Demo() { }
~Demo() { } // ❌ Compiler Error: 'Demo' already defines a member called '~Demo'
}
ডিস্ট্রাক্টর vs Dispose
| বিষয় | Destructor (~Finalize) | Dispose() |
|---|---|---|
| কলার | GC (অটোমেটিক) | ডেভেলপার (ম্যানুয়াল) |
| সময় | নন-ডিটারমিনিস্টিক | ডিটারমিনিস্টিক |
| প্যারামিটার | নেই | নেই (প্যাটার্নে bool disposing থাকে) |
| ইন্টারফেস | নেই | IDisposable |
| using ব্লকে কাজ করে | না | হ্যাঁ |
সেরা প্র্যাকটিস
- আনম্যানেজড রিসোর্স থাকলে Dispose Pattern ইমপ্লিমেন্ট করুন (Dispose + Finalize)
- শুধু ম্যানেজড রিসোর্স হলে শুধু
IDisposableকরুন, ফাইনালাইজার দরকার নেই GC.SuppressFinalize(this)Dispose-এ কল করে ফাইনালাইজার এড়িয়ে যান