2009-12-28 8 views
19

कई बार एक स्पष्ट विधि है, जो संग्रह से सभी वस्तुओं को हटा देती है, क्या ये आइटम भी निपटाए जाते हैं।क्या कॉलिंग साफ़ आइटम को भी डिस्पोजेक्ट करता है?

की तरह,

toolStripMenuItem.DropDownItems.Clear(); 

के लिए पर्याप्त है, या मैं उस तरह कॉल करने के लिए होना चाहिए:

foreach (ToolStripItem item in toolStripMenuItem.DropDownItems) 
{ 
    toolStripMenuItem.DropDownItems.Remove(item); 
    item.Dispose(); 
} 

संपादित करें: ठीक है ToolStripItem एक उदाहरण नहीं एक सवाल, उन लोगों के लिए जो कहते हैं साफ पर्याप्त है मुझे एक और उदाहरण मिला, टैबकंट्रोल में आइटम संग्रह और स्पष्ट विधि भी है। लेकिन TabControls में जटिल नियंत्रण हो सकते हैं (कम से कम मेरे पास है), जिसे स्पष्ट रूप से निपटाना होगा (भले ही वे जीसी द्वारा किसी बिंदु पर स्वचालित रूप से डिसपॉइड हो जाएं, क्योंकि वे बड़ी मेमोरी लेते हैं)। मुझे लगता है कि वस्तुओं का निपटान करने के लिए सबसे अच्छा जवाब divo टिप्पणी है, और फिर स्पष्ट कॉल करें।

+0

मेरा मानना ​​है कि लेखक एक सी/सी ++ डेवलपर है जो प्रत्येक कार्य में संसाधनों का निपटान करने के लिए "ज़रूरत" है, भले ही .NET में ऐसी आवश्यकता न हो। मुझे संग्रह से * साफ़ * करने के बाद वस्तुओं को अंतिम रूप देने/निपटाने की आवश्यकता के बारे में संदेह है। – serhio

+3

@ सेरियियो - .NET में, अभी भी 'IDISposable' संसाधनों पर 'निपटान()' को कॉल करने का आपका काम है, या यह सुनिश्चित करें कि किसी अन्य कोड द्वारा' निपटान() 'कहा जाता है। –

+0

.NET Reflector का उपयोग करना यह देखने का एक अच्छा तरीका है कि 'ToolStripItemCollection.Clear()' वास्तव में संग्रह वस्तुओं पर 'निपटान' कहता है या नहीं। यदि आप अलग किए गए स्रोत को देखते हैं तो आप देखेंगे कि यह नहीं है। –

उत्तर

8

प्रश्न: करता है?

एक: नहीं - Clear आइटम निपटान नहीं करता है (वे अपने आवेदन के अन्य भागों में इस्तेमाल किया जा सकता है)।

तो, यदि आपके टूलस्ट्रिपइटम मानक हैं .NET वाले, Clear पर्याप्त होना चाहिए? कुछ प्रतिबिंब के बाद मैं "शायद नहीं" कहूंगा।

हाँ, यह है कि अगर आप अपने आवेदन के अन्य हिस्से में ToolStripItem के सभी संदर्भ, .NET GarbageCollector को नष्ट कर देगा होगा स्वचालित रूप से (कक्षा नाशक का उपयोग करें) यह सच है। लेकिन, यह Dispose(true) विधि पर कॉल नहीं करेगा, हालांकि, फ़ॉर्म के IDisposable घटकों के लिए आवश्यक है।

एक प्रस्ताव पढ़ें this और this

वास्तव में, मुझे विश्वास है कि आप, हालांकि, करने के लिए स्पष्ट रूप से Dispose अपने आइटम की जरूरत है, ToolStrip के निपटान विधि की तरह करता है (इस की जगह द्वारा yourToolStrip):

if (!this.Items.IsReadOnly) 
{ 
    for (int i = this.Items.Count - 1; i >= 0; i--) 
    { 
     this.Items[i].Dispose(); 
    } 
    this.Items.Clear(); 
} 

संपादित

मैंने इस प्रश्न को अधिक आम तौर पर स्पष्ट करने के लिए the following thread भी बनाया।

+3

सही नहीं किया गया है, संग्रह में वस्तुओं को निपटान की आवश्यकता होने पर स्पष्ट नहीं होगा। फाइनल * * ऑब्जेक्ट का निपटान कर सकता है; हालांकि, यह तब होगा जब यह घटित नहीं होगा और यह निश्चित नहीं है कि यह बिल्कुल भी होगा (http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx देखें: "अंतिम रूप दें विधि पूर्ण हो सकती है या निम्नलिखित असाधारण परिस्थितियों में नहीं चल सकती है ... " –

+0

मुझे संग्रह से * साफ़ * करने के बाद आइटम को अंतिम रूप देने/निपटाने की आवश्यकता के बारे में संदेह है। – serhio

+0

हाय सेरियो, यह नहीं होना चाहिए 'यदि आपके पास कोई संदर्भ नहीं होना चाहिए' यदि आपके पास कोई संदर्भ नहीं है ' –

0

मुझे ऐसा नहीं लगता है, यह कई तार्किक समस्याओं का कारण बन सकता है क्योंकि आप बाद में उपयोग के लिए संग्रह में उस ऑब्जेक्ट का संदर्भ ले सकते हैं। यदि आपके पास उस ऑब्जेक्ट्स के संदर्भ नहीं हैं तो कचरा कलेक्टर उस ऑब्जेक्ट को बाद में

+0

एचएम ... .NET में सूचक सही शब्द नहीं है। – serhio

+0

@serhio –

2

जब आप अप्रबंधित स्मृति, साझा संसाधन या बड़े मेमोरी क्षेत्रों से निपट रहे हैं तो आपको Dispose() पर भरोसा करना चाहिए। ऐसा नहीं लगता है।

2

कॉलिंग Clear आइटम का निपटान नहीं करता है, लेकिन यह संग्रह से संदर्भों को संदर्भ में हटा देता है। यदि वह वस्तुओं का एकमात्र संदर्भ था तो वे कुछ बिंदु पर स्वचालित रूप से कचरा इकट्ठा किया जाएगा (जिसे आप भविष्यवाणी नहीं कर सकते हैं, लेकिन आप GC कक्षा का उपयोग कर नियंत्रित कर सकते हैं)।

+0

निपटान के लिए कचरा कलेक्टर पर निर्भर करना सुरक्षित नहीं है। Serhio के जवाब पर मेरी टिप्पणी देखें। –

+0

@divo: यदि आपका टूलस्ट्रिपइटम एक मानक WinForm ऑब्जेक्ट है तो अपने कोड को कचरे से भरने की कोई आवश्यकता है। – serhio

+0

@ सेरियियो: "सामान्य" विंडोज फॉर्म एप्लिकेशन में आमतौर पर 'घटक' कॉल करना आवश्यक नहीं है।निपटान() 'स्पष्ट रूप से इसे पहले से ही बुलाया गया है, तो फॉर्म बंद है (पीछे डिज़ाइनर-जेनरेट कोड देखें, यह' निपटान 'को ओवरराइट करता है और फ़ॉर्म में प्रयुक्त प्रत्येक घटक पर' निपटान 'कहता है)। हालांकि, अगर आप रनटाइम पर गतिशील रूप से घटकों को जोड़ते और निकालते हैं, तो इन घटकों को स्पष्ट रूप से निपटाने की आपकी ज़िम्मेदारी है। –

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