2010-08-06 11 views
5

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

उत्तर

7

नहीं। प्रत्येक सामान्य प्रबंधित .NET ऑब्जेक्ट को कचरा इकट्ठा किया जाता है जब आप इसका जिक्र करते हैं। IDISposable का मतलब है कि आप एक निपटान() विधि को लागू करेंगे जिसे कॉलर द्वारा बुलाया जाना चाहिए - यह आमतौर पर उन चीजों को जारी करता है जिन्हें एकत्रित नहीं किया जाता है। यह स्मृति को जारी करने के लिए एक निर्धारित स्थान होने में भी मदद करता है।

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। तो अगर मेरे पास कक्षा ए है और इसके सार्वजनिक फ़ंक्शन में से एक बिटमैप जैसे अप्रबंधित ऑब्जेक्ट बनाता है और बिटमैप को कॉल करता है। डिसस्पेक्ट(), तो क्या यह कचरा इकट्ठा होगा या कक्षा ए बिटमैप का संदर्भ रखता है? – kishore

+0

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

+0

इसके अलावा, आपको निश्चित रूप से IDISposable लागू नहीं करना चाहिए जब तक कि आपको आवश्यकता न हो। इससे जीसी धीमी गति से उन्हें निपटना पड़ता है (अंतिम रूप देने के लिए याद रखना आदि)। यदि आपके पास ऐसी संपत्ति है जो डिस्पोजेबल या अप्रबंधित संसाधन है, तो इसे लागू करें। –

3

नहीं, प्रत्येक ऑब्जेक्ट स्वचालित रूप से निपटाया जाता है।

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

1

IDISposable का उपयोग तब किया जाना चाहिए जब आप अपने कोड में फ़ाइल स्ट्रीम जैसे कुछ देशी संसाधनों का उपयोग करना चाहते हैं। अन्य सभी उद्देश्यों के लिए, नेट कचरा कलेक्टर एक अच्छा काम करता है।

बस आईडीस्पोजेबल को लागू करने से कचरा संग्रह लागू नहीं होता है। किसी भी मूल संसाधन को साफ करने के लिए निपटान विधि को स्पष्ट रूप से बुलाया जाना चाहिए।

संपादित करें: मैं आपको जेफ रिचटर द्वारा ClR via C# में कचरा संग्रह अध्याय के माध्यम से जाने की सलाह दूंगा।

1

नहीं। आपके उपयोगकर्ता परिभाषित वर्ग को कचरा संग्रह है जब इसे कहीं और संदर्भित नहीं किया जाता है। आप इसे classObject = null कर कर मजबूर कर सकते हैं। यदि वह उस एप्लिकेशन का अंतिम भाग है जो वर्तमान में classObject का संदर्भ दे रहा है तो कचरा संग्रह इसकी याददाश्त को साफ़ कर देगा।

IDisposable अधिकतर उपयोग किया जाता है ताकि आप using() विधियों के माध्यम से कचरा संग्रहण गतिविधियों को व्यवस्थित कर सकें।

1

कोई यह नहीं है: IDisposable पैटर्न बाहर

चेक सुनिश्चित करें कि आप इसे सही करने के बनाने के लिए। Dispose() विधि को अतिरिक्त कार्य करने के लिए डिज़ाइन किया गया है जो संसाधनों का निपटान करते हैं जिन्हें ऑब्जेक्ट का उपयोग नहीं किया जाता है जब निपटान किया जाना चाहिए। याद रखें, ऑब्जेक्ट आखिरी संदर्भ खोने के बाद एकत्रित कचरा एक लंबा समय हो सकता है।

जब IDisposable आप वस्तु निपटाने चाहिए जब अपने fx using के साथ किया

using (SomeClassWithDisp object = new SomeClassWithDisp()) 
{ 
    //Use the object 
} 

भी तरह प्रयोग किया जाता है, देखें:

What is the difference between using IDisposable vs a destructor in C#?

1

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

यह एक नाशक का एक अच्छा उदाहरण इस्तेमाल किया जा रहा है: http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

1

निपटाने() विधि आप को लागू स्पष्ट रूप से ऊपर अप्रबंधित संसाधन (फ़ाइलें, धाराओं, संभालती है, आदि) जो करने के लिए अपने वस्तु एक रखती है मुक्त करने के लिए प्रयोग किया जाता है संदर्भ।

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

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