24

मुझे पता है सी # अपने कचरा कलेक्टर के साथ संसाधन को अच्छी तरह से प्रबंधित कर सकता है। लेकिन चूंकि इसमें यह है, यह वास्तव में क्या है और इसकी आवश्यकता क्यों है?एएसपीनेट एमवीसी नियंत्रकों में एक स्पष्ट निपटान() विधि की आवश्यकता क्यों है? क्या कोई अपनी जटिलताओं को समझा सकता है? (एएसपीनेट विशिष्ट)

क्या कोई बता सकता है कि .Dispose() एएसपीनेट एमवीसी में क्यों आवश्यक है?

इसके अलावा, कनेक्शन का निपटान करने का क्या अर्थ है? इसकी आवश्यकता क्यों है? किसी को भी db.Dispose() जैसे डेटाबेस कनेक्शन का निपटान करना महत्वपूर्ण क्यों है, इसकी जटिलताओं को पता है? क्या यह ईएफ-संबंधित, या एसक्यूएल सर्वर से संबंधित है? मैं वास्तव में समझने की कोशिश क्यों कर रहा हूं।

protected override void Dispose(bool disposing) 
{ 
    db.Dispose(); 
    base.Dispose(disposing); 
} 
+2

आम तौर पर, यदि यह एक 'आईडीस्पोजेबल' है, और आप किसी भी 'आईडीस्पोजेबल' पर हो रहे हैं, तो 'निपटान करें' विधि प्रदान करें। और इसका इस्तेमाल करें। – cHao

+0

मैंने इसके बारे में सुना है ... लेकिन वास्तव में क्यों? क्या सी # में एक कचरा कलेक्टर नहीं है जो एक बार गुंजाइश से बाहर निकलने के बाद अनियंत्रित वस्तुओं को नष्ट कर देता है? तो, वहाँ एक स्पष्ट क्यों है।() विधि जैसे कि asp.net mvc के लिए नियंत्रकों में? और यहां तक ​​कि इकाई फ्रेमवर्क पर भी? यह वास्तव में क्या करता है? –

+0

[सी # अंतिमकरण/निपटान पैटर्न] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern) कृपया IDISposable टैग के लिए शीर्ष उत्तरों देखें (एमवीसी के लिए विशिष्ट कुछ भी नहीं है IDISposable के उपयोग और कार्यान्वयन)। –

उत्तर

27

Dispose "अप्रबंधित" संसाधनों (उदाहरण के लिए, सॉकेट, फ़ाइल हैंडल, बिटमैप हैंडल, आदि) को रिहा करने के लिए है, और अगर यह एक finalizer बाहर बुलाया जा रहा है, के लिए (कि क्या disposing ध्वज का प्रतीक, BTW है) अन्य IDISposable ऑब्जेक्ट्स को डिस्पोजेक्ट करना जो अब रखता है जो अब उपयोगी नहीं हैं।

"अप्रबंधित" संसाधन सीएलआर (इसलिए नाम) द्वारा प्रबंधित नहीं होते हैं, और जीसी उनके साथ गड़बड़ नहीं करता है या उन्हें स्वयं ही मुक्त नहीं करता है; अनुपस्थित Dispose विधि (और वास्तव में इसका उपयोग करने वाला कोड!), यह साफ करने के लिए ऑब्जेक्ट के फ़ाइनलाइज़र पर भरोसा करेगा। आखिरकार फाइनलर चलाएगा (यदि ऐप का स्वस्थ है, और ऑब्जेक्ट में एक फाइनलाइज़र है), और यदि फाइनलाइज़र अपना काम करता है तो सभी अर्ध ठीक है .... लेकिन ऐसा करने में यह मेरा प्यारा समय लगेगा - और यदि आप इस दौरान हैंडल से बाहर हो जाते हैं, ओह ठीक है। उस अन्य थ्रेड/प्रक्रिया के लिए बहुत बुरा/जो भी उन्हें चाहिए।

यदि आप Dispose, हालांकि, संसाधन तुरंत जारी किए जाते हैं, और चीजें चारों ओर बेहतर चलती हैं।

(वैसे, यह ईएफ, एसक्यूएल सर्वर, या किसी अन्य तकनीक तक ही सीमित नहीं है। डिस्पोजेबल पैटर्न पूरे नेट फ्रेमवर्क में पाया जाता है, और जब भी आपके पास IDISposable होता है तो इसका लाभ उठाने के लिए अच्छा अभ्यास माना जाता है अब इसका उपयोग नहीं किया जा रहा है।)

क्यों IDisposable को पेड़ तक अब तक लागू किया गया है, बजाय आप इसे मामले के आधार पर इसे लागू करने के बजाय ... मैं 100% निश्चित नहीं हूं। लेकिन कल्पना करें कि आप एक ढांचा लिख ​​रहे थे। इस बात पर विचार करें कि अगर सबकुछ एक आईडीस्पोज़ेबल नहीं था, तो आपको जांचना होगा - हर बार जब आप कुछ छुटकारा पाने के लिए चाहते थे! - क्या वस्तु डिस्पोजेबल है, और Dispose यदि ऐसा है तो। यदि आप इसके बजाय "बस मामले में" IDISposable लागू करते हैं, हालांकि, चीजें सरल हैं - आप बस हमेशा निपटान करते हैं। (यदि किसी ऑब्जेक्ट में साफ करने के लिए कुछ भी नहीं है, तो यह Dispose को ओवरराइड नहीं करता है - इस स्थिति में उसके माता-पिता के Dispose को कॉल किया जाता है और जो भी क्लीनअप होता है, जो कुछ भी नहीं हो सकता ...) और यह नियंत्रकों के लिए सामानों को साफ करने के लिए एक आम पर्याप्त मामला है, भले ही यह वास्तविक कारण न हो, फिर भी यह करने के लिए बहुत समझदारी होती है।

+3

एएसपी.नेट एमवीसी नियंत्रकों द्वारा कौन से अप्रबंधित संसाधन जारी किए जाते हैं? –

+1

वे क्या करते हैं, और वे इसे कैसे करते हैं, इस पर निर्भर करता है। मैं एएसपीनेट एमवीसी के अंदरूनी हिस्से को नहीं जानता, लेकिन मुझे लगता है कि इसमें बहुत से फाइल हैंडल शामिल हैं। नियंत्रक, संभावित रूप से अन्य वस्तुओं को एक डीबी कनेक्शन युक्त? पता नहीं, परवाह नहीं है। यदि आप किसी भी चीज़ पर ध्यान केंद्रित कर रहे हैं, तो यह 'निपटान' विधि प्रदान करने के लिए अच्छा शिष्टाचार है ... और जो कुछ भी आपके ऑब्जेक्ट को कॉल करने के लिए रखता है। – cHao

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