2009-11-07 14 views
54

मैंने सोचा कि जीसी अंततः निपटान करेगा यदि आपका प्रोग्राम ऐसा नहीं था लेकिन आपको क्लीनअप निर्धारिती बनाने के लिए अपने प्रोग्राम में निपटान() को कॉल करना चाहिए।कचरा कलेक्टर कॉल निपटान()?

हालांकि, मेरी छोटी परीक्षण कार्यक्रम से, मैं देख रहा हूँ सब पर बुलाया हो रही निपटान नहीं है ....

public class Test : IDisposable 
{ 
    static void Main(string[] args) 
    { 
     Test s = new Test(); 
     s = null; 
     GC.Collect(); 
     Console.ReadLine(); 
    } 

    public Test() 
    { 
     Console.WriteLine("Constructor"); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

// आउटपुट बस "निर्माता", मैं नहीं मिलता है "फेंक" जैसा कि मैं उम्मीद करता हूँ। क्या हो रहा है?

संपादित करें: हाँ, मुझे पता है कि मुझे निपटान करना चाहिए() - मैं डिस्पोजेबल ऑब्जेक्ट्स का उपयोग करते समय मानक पैटर्न का पालन करता हूं। मेरा सवाल उठता है क्योंकि मैं किसी को एल्स कोड में रिसाव को ट्रैक करने की कोशिश कर रहा हूं, जिसे प्रबंधित किया जाता है सी ++ (जटिलता की एक और परत जो किसी अन्य धागे का अच्छा विषय होगा)।

+0

पर यह अधिक विस्तृत उत्तर मिल सकते हैं यह प्रश्न [http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for का डुप्लिकेट है -me] (http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for-me)। –

उत्तर

50

जीसी Dispose पर कॉल नहीं करता है, यह आपके अंतिमकर्ता को कॉल करता है (जिसे आपको Dispose(false) पर कॉल करना चाहिए)।

कृपया तरफ संबंधित पोस्ट को देखने या निपटान पैटर्न के लिए सी # सर्वोत्तम प्रथाओं को देखने के (docs on IDisposable काफी अच्छी तरह से यह IIRC समझाने।)

+4

नाम "फिनियालाइज़र" है, यह शायद दुर्भाग्यपूर्ण है कि सी # सी ++ विनाशक के रूप में समान वाक्यविन्यास का उपयोग करता है। –

+1

ठीक है, मेरी भाषाएं यहाँ उलझन में आ रही हैं। – Eloff

+4

यह ध्यान दिया जाना चाहिए कि डिफ़ॉल्ट * फ़ाइनलाइज़र * कुछ भी नहीं करता है। यह भी देखें: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight

संबंधित मुद्दे