फाइलर्स हैंडल, सॉकेट, कर्नेल ऑब्जेक्ट इत्यादि जैसे सिस्टम में दुर्लभ संसाधनों की रिहाई की गारंटी के लिए अंतिमकर्ताओं की आवश्यकता होती है क्योंकि अंतिमकर्ता हमेशा के अंत में चलता है ऑब्जेक्ट्स लाइफ, यह हैंडल जारी करने के लिए नामित जगह है।
Dispose
पैटर्न संसाधनों के निर्धारिक विनाश प्रदान करने के लिए उपयोग किया जाता है। चूंकि .NET रनटाइम कचरा कलेक्टर गैर-निर्धारिती है (जिसका अर्थ है कि आप कभी भी सुनिश्चित नहीं हो सकते कि रनटाइम पुराने ऑब्जेक्ट्स एकत्र करेगा और उनके फ़ाइनलज़र को कॉल करेगा), सिस्टम संसाधनों की निर्धारणात्मक रिलीज सुनिश्चित करने के लिए एक विधि की आवश्यकता थी। इसलिए, जब आप Dispose
पैटर्न को सही ढंग से कार्यान्वित करते हैं तो आप संसाधनों की निर्धारणात्मक रिलीज प्रदान करते हैं और ऐसे मामलों में जहां उपभोक्ता लापरवाह है और वस्तु का निपटान नहीं करता है, तो अंतिमकर्ता वस्तु को साफ कर देगा।
क्यों Dispose
की जरूरत है एक त्वरित और गंदा लॉग विधि हो सकता है की एक साधारण उदाहरण:
public void Log(string line)
{
var sw = new StreamWriter(File.Open(
"LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
sw.WriteLine(line);
// Since we don't close the stream the FileStream finalizer will do that for
// us but we don't know when that will be and until then the file is locked.
}
उपरोक्त उदाहरण में, फ़ाइल जब तक कचरा कलेक्टर StreamWriter
वस्तु पर finalizer कॉल बंद कर दिया रहेगा। यह तब से एक समस्या प्रस्तुत करता है, इस बीच, विधि को लॉग लिखने के लिए फिर से बुलाया जा सकता है, लेकिन इस बार यह विफल हो जाएगा क्योंकि फ़ाइल अभी भी लॉक है।
सही तरीका वस्तु निपटान के लिए जब यह का उपयोग किया जाता है:
public void Log(string line)
{
using (var sw = new StreamWriter(File.Open(
"LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))) {
sw.WriteLine(line);
}
// Since we use the using block (which conveniently calls Dispose() for us)
// the file well be closed at this point.
}
Btw, तकनीकी रूप से finalizers और विनाशकर्ता एक ही बात मतलब है; मैं सी # विनाशकों के फाइनलाइजर्स को कॉल करना पसंद करता हूं क्योंकि अन्यथा वे सी ++ विनाशकों के साथ लोगों को भ्रमित करते हैं, जो सी # के विपरीत, निर्धारक हैं।
आईएमओ यह सबसे अच्छा जवाब है। इसका सबसे महत्वपूर्ण हिस्सा - और हम डिस्पोजेबल सिंटैक्स का उपयोग क्यों करते हैं - दुर्लभ संसाधनों की * निर्धारिक रिलीज * प्रदान करना है। महान पद। – Rob
अच्छा जवाब, हालांकि अंतिमकर्ता स्वचालित रूप से वस्तुओं के जीवन के अंत में नहीं चलते हैं। अन्यथा हमें डिस्पोजेबल पैटर्न की आवश्यकता नहीं होगी। उन्हें जीसी द्वारा बुलाया जाता है जब यह निर्धारित करता है कि इसे चलाने की जरूरत है (जो जानता है कि कब)। रिकॉर्ड के लिए –
। फाइनलरों को चलाने की गारंटी नहीं है। उन्हें अनुक्रमिक रूप से एक समर्पित थ्रेड द्वारा निष्पादित किया जाता है, इसलिए यदि कोई फाइनलाइज़र डेडलॉक में प्रवेश करता है तो कोई अन्य फ़ाइनलाइज़र नहीं चलाएगा (और स्मृति रिसाव होगी)। जाहिर है फाइनलाइज़र को ब्लॉक नहीं करना चाहिए, लेकिन मैं सिर्फ यह कह रहा हूं कि चेतावनी हैं। –