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);
}
}
}
তুলনা সারসংক্ষেপ
| বিষয় | Finalize | Dispose |
| কলার | GC (অটোমেটিক) | ডেভেলপার (ম্যানুয়াল) |
| সময় | নন-ডিটারমিনিস্টিক | ডিটারমিনিস্টিক |
| রিসোর্স | শুধু আনম্যানেজড | ম্যানেজড + আনম্যানেজড |
| ইন্টারফেস | নেই (Object.Finalize) | IDisposable |
| পারফরম্যান্স | ওভারহেড (জেনারেশন ২-এ যাবে) | কম ওভারহেড |
Microsoft-র সুপারিশ
আনম্যানেজড রিসোর্স থাকলে Dispose এবং Finalize দুটোই ইমপ্লিমেন্ট করুন। ডেভেলপার Dispose কল না করলেও, GC ফাইনালাইজার চালিয়ে রিসোর্স রিলিজ করবে।
using স্টেটমেন্ট (সেরা প্র্যাকটিস)
using (var demo = new Demo()) {
// কাজ করুন
} // এখানে অটোমেটিক Dispose() কল হবে (এক্সেপশন হলেও)