2012-12-21 15 views
47

मैं अध्ययन कर रहा हूं कि कैसे कचरा कलेक्टर सी # में काम करता है। मैं Destructor, Dispose और Finalize विधियों के उपयोग पर उलझन में हूं।विध्वंसक, निपटान और विधि को अंतिम रूप देने के बीच

अपना शोध और समझ के अनुसार, मेरी कक्षा के भीतर एक नाशक विधि कचरा कलेक्टर बता रास्ता नाशक विधि है जो वर्ग के उदाहरण पर स्पष्ट रूप से नहीं कहा जा सकता में वर्णित में कचरा संग्रहण प्रदर्शन करने के लिए होगा है।

Dispose विधि उपयोगकर्ता को कचरा संग्रह को नियंत्रित करने के लिए प्रदान करने के लिए है। Finalize विधि वर्ग द्वारा उपयोग किए जाने वाले संसाधनों को मुक्त करती है, लेकिन ऑब्जेक्ट स्वयं ही नहीं।

मुझे यकीन नहीं है कि मैं इसे सही तरीके से समझता हूं। कृपया संदेह स्पष्ट करें। कोई और लिंक या गाइड का स्वागत है।

उत्तर

45

विनाशक अंतिम रूप से अंतिम विधि कहता है, वे तकनीकी रूप से समान हैं। निपटान उन ऑब्जेक्ट्स के साथ उपलब्ध है जो IDISposable इंटरफेस लागू करता है।

आप देख सकते हैं: Destructors C# - MSDN

नाशक परोक्ष वस्तु के आधार वर्ग पर अंतिम रूप कहता है।

class Car 
{ 
    ~Car() // destructor 
    { 
     // cleanup statements... 
    } 
} 

नाशक कोड परोक्ष निम्नलिखित कोड को अनुवाद किया है::

protected override void Finalize() 
{ 
    try 
    { 
     // Cleanup statements... 
    } 
    finally 
    { 
     base.Finalize(); 
    } 
} 

नाशक के लिए आपकी समझ सही है:

MSDN से ही लिंक से

उदाहरण

प्रोग्रामर का कोई नियंत्रण नहीं है जब विनाशक को कहा जाता है क्योंकि यह कचरा कलेक्टर द्वारा निर्धारित किया जाता है। कचरा कलेक्टर उन वस्तुओं के लिए जांच करता है जिनका उपयोग अब एप्लिकेशन द्वारा नहीं किया जा रहा है। यदि यह किसी ऑब्जेक्ट को विनाश के योग्य मानता है, तो यह विनाशक (यदि कोई है) को कॉल करता है और ऑब्जेक्ट ऑब्जेक्ट को संग्रहीत करने के लिए उपयोग की जाने वाली मेमोरी को पुनः प्राप्त करता है। जब कार्यक्रम निकलता है तो विनाशकों को भी बुलाया जाता है। यह कलेक्ट को कॉल करके कचरा संग्रह को मजबूर करने के लिए संभव है, लेकिन अधिकांश उस समय से बचा जाना चाहिए क्योंकि इससे प्रदर्शन समस्याएं हो सकती हैं।

+0

'संग्रह()' कॉल करके कचरा संग्रह को कैसे मजबूर करना विधि के मुद्दों को बना सकता है? – Destructor

35

सी # शब्दों में, एक नाशक और finalizer मूल रूप से परस्पर विनिमय अवधारणाओं रहे हैं, और उदाहरण के बाहरी हैंडल के लिए, जब एक प्रकार एकत्र किया जाता है अप्रबंधित संसाधन जारी करने के लिए इस्तेमाल किया जाना चाहिए। यह बहुत दुर्लभ है कि आपको अंतिमकरण लिखने की आवश्यकता है।

उस के साथ समस्या यह है कि जी सी गैर नियतात्मक है है, इसलिए (IDisposable के माध्यम से) Dispose() विधि यह संभव नियतात्मक सफाई का समर्थन करने के लिए बनाता है।यह कचरा संग्रह से असंबंधित है, और कॉलर को जल्द से जल्द जारी करने की अनुमति देता है। यह प्रबंधित संसाधनों (अप्रबंधित के अलावा) के उपयोग के लिए भी उपयुक्त है, उदाहरण के लिए यदि आपके पास (कहें) डेटाबेस कनेक्शन encapsulates है, तो आप कनेक्शन को रिहा करने के लिए प्रकार का निपटान करना चाह सकते हैं।

+0

तो मुझे क्या लगता है कि विनाशक विधि में केवल उस कोड को शामिल किया जाना चाहिए जिसे इसके विनाश से पहले निष्पादित किया जाना चाहिए, इसके बाद अंतिम विधि सुपर क्लास से विरासत में प्राप्त की जाएगी। –

+3

@ विक्टर मुखर्जी फिर से, वे (विनाशक और फाइनलाइज़र) एक दूसरे के बदले में हैं। यह 'निपटान() 'है जिसे * विनाश से पहले * कहा जाएगा, लेकिन इसे विनाशक या अंतिम रूपक के रूप में संदर्भित नहीं किया जाता है –

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