परिचय
फाइनलाइज़र (~ClassName()) ऑब्जेक्ट नष्ट होने से पहले अनमैनेज्ड संसाधन मुक्त करने के लिए उपयोग होता है। गारबेज कलेक्टर द्वारा स्वचालित रूप से कॉल किया जाता है।
नियम
- एक क्लास में केवल एक फाइनलाइज़र।
- इनहेरिट/ओवरलोड नहीं किया जा सकता।
- कोई पैरामीटर/एक्सेस मोडिफायर नहीं।
- नियतात्मक नहीं: कॉल समय अनिश्चित (GC पर निर्भर)।
सिंटैक्स
class Demo
{
~Demo()
{
// अनमैनेज्ड क्लीनअप
Console.WriteLine("Finalizer called");
}
}
पैटर्न: Dispose + Finalizer (SafeHandle अनुशंसित)
using System;
class ResourceHolder : IDisposable
{
private IntPtr _handle; // अनमैनेज्ड संसाधन
private bool _disposed;
public ResourceHolder()
{
_handle = AllocateResource();
}
// पब्लिक Dispose
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // फाइनलाइज़र दबाएं
}
// प्रोटेक्टेड वर्चुअल
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// मैनेज्ड संसाधन मुक्त करें
}
// अनमैनेज्ड मुक्त करें
FreeResource(_handle);
_handle = IntPtr.Zero;
_disposed = true;
}
}
// फाइनलाइज़र (Dispose(false) कॉल करता है)
~ResourceHolder() => Dispose(false);
}
आधुनिक विकल्प
SafeHandleडेराइव्ड क्लास (SafeFileHandle,SafeRegistryHandle) - फाइनलाइज़र स्वचालित।usingस्टेटमेंट /IDisposable- नियतात्मक क्लीनअप।