Finalize
Finalize() को गारबेज कलेक्टर द्वारा उस ऑब्जेक्ट के पुनः प्राप्त करने से पहले बुलाया जाता है जो संग्रह के लिए योग्य है। गारबेज कलेक्टर अनरेफरेंस्ड ऑब्जेक्ट के लिए मेमोरी को डीएलोकेट करने की जिम्मेदारी लेता है। गारबेज कलेक्टर इस मेथड को उस समय के कुछ बिंदु पर कॉल करता है जब मेमोरी में उस ऑब्जेक्ट के लिए कोई वैध रेफरेंस नहीं रह जाते।
फ्रेमवर्क यह गारंटी नहीं देता कि यह कब होगा, हम गारबेज कलेक्शन के लिए बाध्य कर सकते हैं लेकिन यह प्रोग्राम के प्रदर्शन को नुकसान पहुंचाएगा। Finalize() ऑब्जेक्ट क्लास से संबंधित है और इसे रनटाइम द्वारा बुलाया जाएगा।
उदाहरण
using System;
namespace DemoApplication{
public class Demo{
~Demo(){
Console.WriteLine("Finalize called");
}
}
}
Dispose
कुछ संसाधन जैसे विंडोज हैंडल्स, डेटाबेस कनेक्शन, नेटवर्क कनेक्शन, फाइलें आदि हैं जिन्हें गारबेज कलेक्टर द्वारा एकत्र नहीं किया जा सकता। यदि हम कुछ विशिष्ट ऑब्जेक्ट्स को स्पष्ट रूप से जारी करना चाहते हैं तो IDisposable को लागू करना और IDisposable इंटरफेस के Dispose() मेथड को ओवरराइड करना सबसे अच्छा है।
Dispose() मेथड स्वचालित रूप से नहीं बुलाया जाता और हमें क्लाइंट एप्लिकेशन से स्पष्ट रूप से इसे कॉल करना होगा जब ऑब्जेक्ट की अब आवश्यकता नहीं है। Dispose() को तब भी बुलाया जा सकता है जब ऑब्जेक्ट के अन्य रेफरेंस जीवित हों।
उदाहरण
using System;
namespace DemoApplication{
public class Demo : IDisposable{
private bool disposed = false;
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (!disposed){
if (disposing){
// मैनेज्ड ऑब्जेक्ट्स को साफ करें
}
// अनमैनेज्ड ऑब्जेक्ट्स को साफ करें
disposed = true;
}
}
}
}
माइक्रोसॉफ्ट अनुशंसा करता है कि अनमैनेज्ड संसाधनों के साथ काम करते समय हम दोनों Dispose और Finalize को लागू करें। Finalize कार्यान्वयन चलेगा और संसाधन तब भी जारी किए जाएंगे जब ऑब्जेक्ट गारबेज कलेक्ट हो जाता है, भले ही डेवलपर ने Dispose मेथड को स्पष्ट रूप से कॉल करने की उपेक्षा की हो।