কম্পিউটার টিউটোরিয়াল

C#-এ একটি ক্লাসে কতগুলো ডিস্ট্রাক্টর থাকতে পারে?

উত্তর: শুধু একটি

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-এ কল করে ফাইনালাইজার এড়িয়ে যান
  1. জাভাতে JTextField-এ প্যাডিং যোগ করুন

  2. পাইথনে A কি B-র সুপারক্লাস তা কীভাবে চেক করবেন?

  3. উইন্ডোজ কতবার রি-ইনস্টল করা যায়?

  4. আপনার MacBook Pro কতটি এক্সটার্নাল মনিটর সাপোর্ট করে?