2010-06-30 15 views
10

मैं वीएस में कुछ एएसपी.NET विकास कर रहा हूं और मुझे एक दिलचस्प मामूली कोड सुझाव मिला है (मुझे लगता है कि वे कोडरश से आते हैं लेकिन मैं गलत हो सकता हूं)।मुझे एएसपी.NET नियंत्रणों पर निपटान क्यों करने की आवश्यकता होगी?

जब भी मैं नियंत्रण बना रहा हूं, यह मुझे बताता है कि मुझे उनके लिए "उपयोग" कथन का उपयोग करना चाहिए। मैं थोड़ी उलझन में हूं कि यहां क्या हो रहा है।

using (HtmlTableRow tableRow = new HtmlTableRow()) 
{ 
    tableRow.Attributes.Add("class", isOddRow ? "OddRow" : "EvenRow"); 
    listingTable.Rows.Add(tableRow); 
    addCell(tableRow, row, "issueId"); 
    addCell(tableRow, row, "Title"); 
    addCell(tableRow, row, "Type"); 
    addCell(tableRow, row, "Summary"); 
} 

इसलिए मैं उम्मीद कर रहा हूँ कि कथन का उपयोग के अंत में यह tableRow पर निपटाने फोन करेगा: मेरे कोड का उपयोग कर के साथ की तरह कुछ लग रहा है। हालांकि, MSDN लाइब्रेरी में डॉक्स का कहना है:

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

तो मैं उम्मीद करता हूं कि अब मेरे नियंत्रण संरचना में एक अनुपयोगी वस्तु है ताकि यह तोड़ने या प्रस्तुत करने या कुछ न हो। हालांकि, सबकुछ ठीक काम करता प्रतीत होता है।

तो मैं क्या सोच रहा हूं कि सभी नियंत्रण डिस्पोजेबल क्यों हैं? क्या यह सिर्फ इसलिए है क्योंकि उनमें से कुछ होंगे और उन्हें सभी डिस्पोजेबल माध्यमों का अर्थ होगा कि शीर्ष स्तर पर निपटने के लिए एक कॉल को फिर से सभी बाल नियंत्रणों में पारित किया जा सकता है?

मुझे लगता है कि अगर मैं स्पष्ट रूप से कहता हूं कि नियंत्रण का निपटान यह अनुपयोगी बनाता है ... क्या दस्तावेज़ सिर्फ गलत हैं?

+0

अगर हम "उपयोग" ब्लॉक का उपयोग नहीं कर रहे हैं तो हम अनाथ वस्तुओं (जिसे @Toby उल्लेख किया गया है) को कैसे संभाला जा सकता है? – Lijo

उत्तर

14

आपको वास्तव में ऐसा नहीं करना चाहिए। आपको क्या करना है यह सुनिश्चित करना है कि लिस्टिंगटेबल Controls संग्रह में है ताकि पृष्ठ का निपटारा होने पर इसका निपटारा किया जा सके। लिस्टिंगटेबल ऑब्जेक्ट तब अपने सभी बच्चों को सही ढंग से निपटाने के लिए ज़िम्मेदार है।

यही कारण है कि सभी Control ऑब्जेक्ट्स IDISposable इंटरफ़ेस को लागू करते हैं। इस तरह प्रत्येक माता-पिता नियंत्रण अपने सभी बच्चों पर Dispose पर कॉल कर सकता है बिना किसी को परीक्षण/कास्ट किए। यह निर्धारित करने के लिए प्रत्येक नियंत्रण अलग-अलग जिम्मेदार होता है कि वास्तव में ऐसा कुछ भी है जिसे साफ़ करने की आवश्यकता है जब इसकी Dispose विधि कहा जाता है।

दस्तावेज़ गलत नहीं हैं। कोई उचित ढंग से लिखित ऑब्जेक्ट जो IDISposable लागू करता है और वास्तव में निपटान प्रक्रिया के दौरान राज्य डेटा को साफ़ किया जाता है, यदि किसी भी सार्वजनिक/संरक्षित/आंतरिक गुणों या विधियों का निपटारा करने के बाद विधियों को एक्सेस किया जाता है तो ऑब्जेक्ट डिस्प्ले अपवाद को फेंकना चाहिए। (Dispose के बाद अमान्य स्थिति मान ली गई है।) कुछ प्रकार इस नियम को अनदेखा कर देंगे यदि उनके पास वास्तव में साफ करने के लिए कुछ भी नहीं है, और अमान्य स्थिति के बारे में चिंता करने की आवश्यकता नहीं है।

कारण आप एक using ब्लॉक में लपेट के लिए है, क्योंकि विश्लेषक एहसास नहीं है कि listingTable अपने Rows संग्रह है, जो पंक्ति वस्तुओं है कि यह करने के लिए जोड़ दिया गया है में से प्रत्येक के निपटान होगा निपटान होगा एक सुझाव हो रही है। साथ ही, यदि HtmlTableRow tableRow = new HtmlTableRow() और listingTable.Rows.Add(tableRow) के बीच कोई अपवाद फेंक दिया गया है, तो HtmlTableRow ऑब्जेक्ट 'अनाथ' होगा और किसी अन्य ऑब्जेक्ट के IDisposable पदानुक्रम में नहीं होगा। कोड विश्लेषण चाहता है कि यदि ऐसा होता है तो HtmlTableRow तुरंत निपटने के लिए प्रयास/अंत में ब्लॉक का उपयोग करें।

+1

धन्यवाद। मुझे उस पर सबसे ज्यादा संदेह था लेकिन यहां क्या हो रहा है इसके बारे में थोड़ा और जानकारी प्राप्त करना अच्छा है। मैं नियंत्रण के "अनाथ" को भी नहीं मानूंगा। – Chris

+0

अगर हम "उपयोग" ब्लॉक का उपयोग नहीं कर रहे हैं तो हम 'अनाथ' वस्तुओं को कैसे संभाल सकते हैं? – Lijo

+0

@Lijo: कोशिश करें/अंत में ब्लॉक का प्रयोग करें – Toby

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