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

C#-তে Finalize এবং Dispose-এর পার্থক্য

Finalize (ফাইনালাইজার)

  • কল করা হয়: গার্বেজ কলেক্টর (GC) দ্বারা, অবজেক্ট রিক্লেইম করার আগে
  • দায়িত্ব: আনম্যানেজড রিসোর্স ক্লিনআপ (ফাইল হ্যান্ডল, ডিবি কানেকশন, নেটওয়ার্ক সকেট)
  • গ্যারান্টি: কখন কল হবে নিশ্চিত নয় (নন-ডিটারমিনিস্টিক)
  • বিলঙ্গে: Object ক্লাসে
  • সিনট্যাক্স: ~ClassName() (ডিস্ট্রাক্টর সিনট্যাক্স)

Dispose

  • কল করা হয়: ডেভেলপার দ্বারা এক্সপ্লিসিট्ली, যখন অবজেক্ট আর দরকার নেই
  • দায়িত্ব: ম্যানেজড + আনম্যানেজড রিসোর্স উভয়ই ক্লিনআপ
  • গ্যারান্টি: ডিটারমিনিস্টিক (আপনি কখন কল করবেন সেটি আপনি নিশ্চিত করেন)
  • ইন্টারফেস: IDisposable
  • প্যাটার্ন: Dispose(bool disposing) ওভাররাইড

Finalize উদাহরণ

using System;

namespace DemoApplication {
    public class Demo {
        ~Demo() { // ফাইনালাইজার (ডিস্ট্রাক্টর সিনট্যাক্স)
            Console.WriteLine("Finalize called");
        }
    }
}

Dispose উদাহরণ (Standard Dispose Pattern)

using System;

namespace DemoApplication {
    public class Demo : IDisposable {
        private bool disposed = false;
        private IntPtr unmanagedResource = IntPtr.Zero; // আনম্যানেজড রিসোর্স
        private FileStream managedResource;              // ম্যানেজড রিসোর্স
        
        public Demo() {
            managedResource = new FileStream("test.txt", FileMode.Create);
            // আনম্যানেজড রিসোর্স অ্যালোকেশন এখানে
        }
        
        // পাবলিক Dispose - ক্লায়েন্ট কল করবে
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this); // ফাইনালাইজার কল না হয় সেজন্য
        }
        
        // প্রোটেক্টেড ভার্চুয়াল - ইনহেরিটেন্সের জন্য
        protected virtual void Dispose(bool disposing) {
            if (!disposed) {
                if (disposing) {
                    // ম্যানেজড রিসোর্স ক্লিনআপ
                    managedResource?.Dispose();
                    managedResource = null;
                }
                
                // আনম্যানেজড রিসোর্স ক্লিনআপ (দুই কেসেই)
                if (unmanagedResource != IntPtr.Zero) {
                    // Marshal.FreeHGlobal(unmanagedResource); // উদাহরণ
                    unmanagedResource = IntPtr.Zero;
                }
                
                disposed = true;
            }
        }
        
        // ফাইনালাইজার - শুধু আনম্যানেজড রিসোর্স থাকলে দরকার
        ~Demo() {
            Dispose(false);
        }
    }
}

তুলনা সারসংক্ষেপ

বিষয়FinalizeDispose
কলারGC (অটোমেটিক)ডেভেলপার (ম্যানুয়াল)
সময়নন-ডিটারমিনিস্টিকডিটারমিনিস্টিক
রিসোর্সশুধু আনম্যানেজডম্যানেজড + আনম্যানেজড
ইন্টারফেসনেই (Object.Finalize)IDisposable
পারফরম্যান্সওভারহেড (জেনারেশন ২-এ যাবে)কম ওভারহেড

Microsoft-র সুপারিশ

আনম্যানেজড রিসোর্স থাকলে Dispose এবং Finalize দুটোই ইমপ্লিমেন্ট করুন। ডেভেলপার Dispose কল না করলেও, GC ফাইনালাইজার চালিয়ে রিসোর্স রিলিজ করবে।

using স্টেটমেন্ট (সেরা প্র্যাকটিস)

using (var demo = new Demo()) {
    // কাজ করুন
} // এখানে অটোমেটিক Dispose() কল হবে (এক্সেপশন হলেও)
  1. DirectX 11 এবং DirectX 12-এর পার্থক্য কী?

  2. C#-এ লিটারেল (Literal) এবং কনস্ট্যান্ট (Constant) এর পার্থক্য

  3. C#-এ String (ক্লাস) এবং string (এলিয়াস) এর পার্থক্য

  4. C#-এ লিস্ট এবং অ্যারেতে পার্থক্য (List vs Array)