2012-03-12 5 views
8

मुझे पता है कि IDisposable को लागू करने वाली सभी ऑब्जेक्ट्स को जल्द ही उनके अप्रबंधित संसाधनों द्वारा उपयोग की जाने वाली मेमोरी को मुक्त करने के लिए आवश्यक नहीं होना चाहिए।क्या मुझे उन वस्तुओं पर निपटान करने के लिए परेशान करना चाहिए जो प्रक्रिया के जीवनकाल को साझा करते हैं?

मेरा प्रश्न उन वस्तुओं से संबंधित है जो मुझे एक तथ्य के लिए तब तक लाइव रहेंगे जब तक होस्ट प्रक्रिया स्वयं समाप्त नहीं हो जाती। अगर मैं उनका निपटान करता हूं या नहीं तो क्या इससे कोई फर्क पड़ता है? क्या प्रक्रिया मरने पर स्मृति को मुक्त नहीं किया जा सकता है? जीडीआई वस्तुओं के बारे में क्या? क्या प्रक्रिया समाप्त होने पर भी जीडीआई संभालती है, भले ही उन्हें निपटाया न जाए?

मैं पूरी तरह से समझता हूं कि वैसे भी सभी वस्तुओं का निपटान करना अच्छा अभ्यास है। मैं जिज्ञासा से पूरी तरह से पूछता हूं।

+0

http://blogs.msdn.com/b/kimhamil/archive/2008/11/05/when-to-call-dispose.aspx वाह, लोग 3 पैर बिल्ली पर कुत्तों के एक पैक की तरह मुझ पर कूद गए निपटाने के लिए कहने के लिए। मैंने पाया है कि इससे मदद मिलती है इससे ज्यादा दर्द होता है। क्या जीवन चक्र को कंटेनर द्वारा प्रबंधित नहीं किया जाना चाहिए, हार्ड कोड नहीं ??? – CrazyDart

+0

@CrazyDart धन्यवाद, यह एक पुनरावृत्ति पढ़ा जाता है, हालांकि यह मुख्य रूप से प्रश्न के साथ सौदा करता है "क्या टाइप एक्स का ऑब्जेक्ट सामान्य रूप से निपटाया जाना चाहिए"। जितना अधिक विशिष्ट सवाल मैं जवाब देने का प्रयास कर रहा हूं, "टाइप एक्स का ऑब्जेक्ट होना चाहिए, जो ** निश्चित रूप से ** सामान्य रूप से निपटाया जाना चाहिए, भले ही इसे प्रक्रिया के जीवनकाल को साझा किया जाए?" – Rotem

+1

@CrazyDart जब आपको निपटान किया गया है तो आपको चोट पहुंची है? आपके द्वारा दिया गया लिंक कुछ उदाहरण देता है जब निपटान नहीं किया जाना चाहिए, लेकिन सामान्य नियम अभी भी इसे तब तक कॉल करना चाहिए जब तक कि आपके पास कोई अच्छा कारण न हो। – hvd

उत्तर

7

यह प्रश्न में वस्तु (संसाधन) पर निर्भर करता है।

जब कोई प्रक्रिया सभी अप्रबंधित स्मृति, फ़ाइलहेडल और अन्य ओएस संसाधनों को समाप्त कर देती है, भले ही संबंधित फ़ाइनलाइज़र चलाने में विफल रहे हों।

लेकिन मैं db हैंडल, नामित-mutexes आदि

तो इससे पहले कि आप इसे सुरक्षित करने के लिए नहीं कॉल निपटान विचार कर सकते हैं के बारे में इतना यकीन नहीं है, तो आप संसाधन प्रकार और कैसे इस बारे में पता करने के लिए होगा प्रक्रिया से संबंधित है। सामान्य सिद्धांत से बाहर निपटान() को कॉल करना बहुत आसान है।

लेकिन यह एक सैद्धांतिक तर्क है, अधिकांश कक्षाएं SafeHandle : CriticalFinalizerObject का उपयोग करेंगी। इसलिए मुझे नहीं लगता कि यह कभी भी वास्तविक व्यावहारिक समस्या है।

+0

डिफ़ॉल्ट रूप से, अंतिम ऑब्जेक्ट वाले प्रत्येक ऑब्जेक्ट में इसके फाइनलज़र चलेंगे। यह विपरीत है कि आप अपने कोड से नियंत्रित कर सकते हैं: आपका 'निपटान' सिग्नल करने के लिए 'GC.SuppressFinalize' को कॉल कर सकता है कि अंतिमकरण अब आवश्यक नहीं है। (संपादित करें: असल में, मुझे लगता है कि प्रत्येक ऑब्जेक्ट में फ़ाइनिज़र होता है, लेकिन डिफ़ॉल्ट रूप से यह कुछ भी नहीं करता है।) – hvd

+1

@hvd - सिद्धांत रूप में, जीसी द्वारा एक सामान्य फाइनलाइज़र छोड़ा जा सकता है। –

+0

@ एचवीडी - "मुझे लगता है कि प्रत्येक ऑब्जेक्ट में फाइनलज़र" सही "होता है, लेकिन डिफ़ॉल्ट रूप से यह कुछ भी नहीं करता है"। यह भी सही है, और बहुत भाग्यशाली है। असली फाइनलर्स महंगा हैं। –

2

सं। डिज़ाइन, आईडीस्पोजेबल एक प्रोग्राम को अंतिम रूप से एक अप्रबंधित संसाधन जारी करने की अनुमति देने के लिए उपलब्ध है, इससे पहले कि इसे अंतिम रूप से किया जा सके। जो एक अनुमानित अप्रत्याशित समय पर चलता है, आमतौर पर बाद में जब भी एक कचरा संग्रह किया जाता है। जब आप ऐसा करते हैं तो आप भविष्यवाणी नहीं कर सकते।

प्रोग्राम से बाहर निकलने में कोई बात नहीं है, तो अंतिमकर्ता को ऐपडोमेन को उतारने से पहले चलाने की गारंटी दी जाती है और प्रक्रिया बंद हो जाती है।

ऐसा कहा जाता है कि कोड के बारे में कुछ IDISposable दुरुपयोग है, वास्तव में आपको कॉल करने की अपेक्षा करता है। लेकिन यह आमतौर पर पर कथन का उपयोग कर रहा है, इसलिए ऐसा नहीं है कि आप इसमें भाग लेंगे।

+1

प्रोग्राम निकास पर चलाने के लिए अंतिमकर्ताओं की गारंटी नहीं है। सिस्टम को चलाने के लिए कुछ प्रयास करने की गारंटी है, लेकिन इसका मतलब यह नहीं है कि वे वास्तव में निष्पादित हो जाएंगे। फाइनलर्स वास्तव में icky हैं, और ज्यादातर वस्तुओं को वास्तव में उन्हें नहीं होना चाहिए। – supercat

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

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