2008-09-22 8 views
11

क्या संसाधनों मैन्युअल में सी # साफ किया जा करने के लिए किया है और ऐसा न करने के परिणामों क्या हैं?संसाधन जिन्हें मैन्युअल रूप से सी # में साफ किया जाना है?

myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black); 
// Use Brush 

अगर मैं निपटाने विधि का उपयोग कर ब्रश को साफ नहीं है, मैं कचरा कलेक्टर स्मृति कार्यक्रम समाप्ति पर इस्तेमाल को मुक्त कर देते संभालने हूँ:

उदाहरण के लिए, मैं निम्नलिखित कोड है कहते हैं? क्या ये सही है?

क्या अन्य संसाधनों मैं मैन्युअल रूप से साफ करने के लिए की जरूरत है?

उत्तर

1

तकनीकी तौर पर कुछ भी विरासत है कि IDisposable सक्रियता से निपटारा किया जाना चाहिए से बहुत कुछ अधिक विस्तार से बताया। चीजों को आसान बनाने के लिए आप 'उपयोग' कथन का उपयोग कर सकते हैं।

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

कभी कभी तुम (अर्थात दृश्य स्टूडियो) प्रलेखन नमूना कोड में IDisposable ली गई वस्तुओं की असंगत उपयोग के साथ ही कोड है कि उपकरण द्वारा उत्पन्न होता है देखेंगे।

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

7
  • आंतरिक विंडोज डेटा संरचनाओं को संभालता है।
  • डेटाबेस कनेक्शन।
  • फ़ाइल हैंडल।
  • नेटवर्क कनेक्शन।
  • COM/OLE संदर्भ।

सूची पर चला जाता है।

Dispose या इससे भी बेहतर कॉल करना महत्वपूर्ण है, using पैटर्न का उपयोग करें।

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black)) 
{ 
    // use myBrush 
} 

आप कुछ निपटान नहीं है, तो यह साफ हो जाएगा जब कचरा कलेक्टर नोटिस वहाँ यह करने के लिए कोई और अधिक संदर्भ है, जो कुछ समय के बाद हो सकता है कर रहा है।

System.Drawing.Brush के मामले में, विंडोज़ स्मृति में लोड ब्रश के लिए आंतरिक विंडोज संरचनाएं रखेगी जब तक कि सभी प्रोग्राम उनके हैंडल को रिलीज़ न करें।

2
आम तौर पर

, कुछ भी लागू करता है कि IDisposable आप रोक सकते हैं और संसाधन का उपयोग कर रहे अनुसंधान करने के लिए पैदा कर देना चाहिए।

जीसी केवल तब होता है जब वहाँ स्मृति दबाव है, तो आप जब अनुमान नहीं लगा सकते। हालांकि ऐपडोमेन का एक अनलोड लोड निश्चित रूप से इसे ट्रिगर करेगा।

-3

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

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

+0

यह उत्तर यह समझाने के लिए था कि आपने अपने संसाधनों को साफ करने के लिए _need_, जब आपको करना चाहिए, जैसा कि दूसरों ने किया था। मूल प्रश्न के स्वर से मैंने माना कि यह वही था जो चाहता था। – Guvante

0

ठीक है, जब तक आप संसाधनों के प्रबंधित संस्करण का उपयोग करते हैं और अपने आप विंडोज़ एपीआई को कॉल नहीं करते हैं, तो आपको ठीक होना चाहिए। जब आप प्राप्त करते हैं तो संसाधन को हटाने/नष्ट करने के बारे में केवल चिंता करें, एक इंटिप्रेट है, क्योंकि "विंडोज हैंडल" (और एक बहुत सारी चीजें) .NET में ज्ञात हैं, न कि ऑब्जेक्ट।

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

7

यदि आप कुछ निपटान नहीं करते हैं, तो कचरा कलेक्टर नोटिस करता है कि आपके कोड में इसका कोई और संदर्भ नहीं है, जो कुछ समय बाद हो सकता है। इस तरह के कुछ के लिए, यह वास्तव में कोई फर्क नहीं पड़ता, लेकिन एक खुली फ़ाइल के लिए यह शायद करता है।

सामान्य, अगर कुछ एक निपटान विधि है, तो आप इसे जब आप इसके साथ समाप्त किया है, तो आप कर सकते हैं, फोन करना चाहिए, या, एक using बयान में यह लपेट में:

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black)) 
{ 
    // use myBrush 
} 
0

अगर यह कामयाब रहा है (यानी ढांचे का हिस्सा) आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। यदि यह IDISposable लागू करता है तो इसे using ब्लॉक में लपेटें।

यदि आप अप्रबंधित संसाधनों का उपयोग करना चाहते हैं तो आपको फाइनल पर पढ़ना होगा और स्वयं को पहचानने योग्य बनाना होगा।

वहाँ के तहत this question

0

प्रोग्राम समाप्ति पर सबसे पहले, आप मान सकते हैं कि प्रक्रिया द्वारा उपयोग की गई स्मृति प्रक्रिया के साथ ही समाप्त हो जाएगी।

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

फाइलों जैसे संसाधनों का उपयोग करते समय, सेमेफर्स और संसाधनों जैसे मेमोरी ऑब्जेक्ट्स जो .NET की प्रबंधित दुनिया के बाहर रहते हैं, को मुक्त किया जाना चाहिए।

उदाहरण के लिए सॉलिडब्रश, आपको निपटान करने की आवश्यकता है क्योंकि यह एक जीडीआई वस्तु है और नेट दुनिया के बाहर रहती है।

0

कचरा कलेक्टर न केवल प्रोग्राम समाप्ति पर मुक्त होता है, अन्यथा यह वास्तव में उपयोगी नहीं होगा (किसी भी सभ्य/हालिया ओएस पर, जब प्रक्रिया निकलती है, तो इसकी सभी मेमोरी ओएस द्वारा स्वचालित रूप से साफ हो जाती है)।

सी/सी ++ की तुलना में सी # का बड़ा लाभ यह है कि आपको आवंटित वस्तुओं को मुक्त करने की परवाह नहीं है (कम से कम समय में); जीसीसी करता है जब रनटाइम निर्णय लेता है (विभिन्न रणनीतियां कब/इसे कैसे करें)।

कई ressources जीसी द्वारा ध्यान नहीं रखा जाता है: फ़ाइल, धागा संबंधी ressources (ताले), नेटवर्क कनेक्शन, आदि ...

3

अपने IDisposables निपटान नहीं करने के परिणाम एक नगण्य प्रदर्शन हिट से भिन्न हो सकते हैं अपने ऐप को दुर्घटनाग्रस्त करने के लिए।

आपके उदाहरण में ब्रश ऑब्जेक्ट जीसी द्वारा साफ किया जाएगा जब ऐसा लगता है। लेकिन आपके कार्यक्रम को उस अतिरिक्त स्मृति का लाभ नहीं होगा जो आपको पहले साफ करके प्राप्त किया गया था। यदि आप ब्रश ऑब्जेक्ट्स का उपयोग कर रहे हैं तो यह महत्वपूर्ण हो सकता है। जीसी ऑब्जेक्ट्स को साफ करने में भी अधिक कुशल है अगर वे बहुत लंबे समय तक नहीं रहे हैं, क्योंकि यह एक पीढ़ी का कचरा कलेक्टर है।

दूसरी तरफ, डेटाबेस कनेक्शन ऑब्जेक्ट्स का निपटान न करने के नतीजे यह हो सकते हैं कि आप पूल किए गए डेटाबेस कनेक्शन से बहुत जल्दी बाहर निकलते हैं और आपके ऐप को क्रैश कर देते हैं।

या तो

using (new DisposableThing... 
{ 
    ... 
} 

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

class MyClass : IDisposable 
{ 
    private IDisposable disposableThing; 

    public void DoStuffThatRequiresHavingAReferenceToDisposableThing() { ... } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    //etc... (see IDisposable on msdn) 

}

0

एक ही स्थान पर सावधान रहने की वस्तुओं कि जीसी करने के लिए छोटे लग रही है लेकिन नहीं कर रहे हैं ... उदाहरण के लिए SharePoint एपीआई में है, SPWeb वस्तु के रूप में अब तक के रूप में एक छोटे पदचिह्न है जीसी का संबंध है और इसलिए संग्रह के लिए कम प्राथमिकता होगी, लेकिन इसने वास्तव में स्मृति की एक गुच्छा पकड़ ली है (ढेर में मुझे विश्वास है) कि जीसी के बारे में पता नहीं है। उदाहरण के लिए यदि आप इनके पूरे समूह का प्रचार कर रहे हैं, तो आप कुछ मजेदार मेमोरी मुद्दों में भाग लेंगे, हमेशा उपयोग या निपटान का उपयोग करना याद रखें!

1

जैसा कि अन्य ने कहा है, आपका मित्र उपयोग कर रहा है। मैंने this blog entry को एक सरल सीधा तरीके से आईडीस्पोजेबल को कार्यान्वित करने के बारे में लिखा है जो कि सबसे महत्वपूर्ण भागों को फैक्टर करके कम त्रुटि-प्रवण है।

1

एक चाल का उपयोग मैं जब मैं याद नहीं कर सकते एक दिया वस्तु एक डिस्पोजेबल संसाधन है कि क्या मेरे लिए जाँच करने के लिए घोषणा के बाद ".Dispose" (! अधिक से अधिक) टाइप करने के लिए Intellisense प्राप्त करने के लिए है:

MemoryStream ms = new MemoryStream().Dispose 

फिर .Dispose हटा सकते हैं और का उपयोग कर() के निर्देश का उपयोग करें: के रूप में "पकड़" संसाधनों जारी होने की जरूरत है कि एक वस्तु के बारे में सोच के बजाय

using(MemoryStream ms = new MemoryStream()) 
{ 
    ... 
} 
+0

ध्यान दें कि यदि निपटान स्पष्ट रूप से कार्यान्वित किया गया है तो यह चाल काम नहीं करेगी! –

0

, यह एक वस्तु के संदर्भ में सोचने के लिए के रूप में होने से बेहतर है कुछ बदल दिया (संभवतः कंप्यूटर के बाहर!) जो एक तरह से सह, इसे बाहर कर देगा uld हानिकारक हो अगर यह पूर्ववत या "साफ" नहीं है, लेकिन केवल वस्तु ही साफ कर सकते हैं। हालांकि यह परिवर्तन आम तौर पर "व्यस्त" चिह्नित पूल में कुछ ठोस वस्तु का रूप लेता है, इसका सटीक रूप कोई फर्क नहीं पड़ता। क्या मायने रखता है कि परिवर्तनों को पूर्ववत करने की आवश्यकता है, और ऑब्जेक्ट को ऐसा करने के लिए आवश्यक जानकारी होती है।

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