Dispose
"अप्रबंधित" संसाधनों (उदाहरण के लिए, सॉकेट, फ़ाइल हैंडल, बिटमैप हैंडल, आदि) को रिहा करने के लिए है, और अगर यह एक finalizer बाहर बुलाया जा रहा है, के लिए (कि क्या disposing
ध्वज का प्रतीक, BTW है) अन्य IDISposable ऑब्जेक्ट्स को डिस्पोजेक्ट करना जो अब रखता है जो अब उपयोगी नहीं हैं।
"अप्रबंधित" संसाधन सीएलआर (इसलिए नाम) द्वारा प्रबंधित नहीं होते हैं, और जीसी उनके साथ गड़बड़ नहीं करता है या उन्हें स्वयं ही मुक्त नहीं करता है; अनुपस्थित Dispose
विधि (और वास्तव में इसका उपयोग करने वाला कोड!), यह साफ करने के लिए ऑब्जेक्ट के फ़ाइनलाइज़र पर भरोसा करेगा। आखिरकार फाइनलर चलाएगा (यदि ऐप का स्वस्थ है, और ऑब्जेक्ट में एक फाइनलाइज़र है), और यदि फाइनलाइज़र अपना काम करता है तो सभी अर्ध ठीक है .... लेकिन ऐसा करने में यह मेरा प्यारा समय लगेगा - और यदि आप इस दौरान हैंडल से बाहर हो जाते हैं, ओह ठीक है। उस अन्य थ्रेड/प्रक्रिया के लिए बहुत बुरा/जो भी उन्हें चाहिए।
यदि आप Dispose
, हालांकि, संसाधन तुरंत जारी किए जाते हैं, और चीजें चारों ओर बेहतर चलती हैं।
(वैसे, यह ईएफ, एसक्यूएल सर्वर, या किसी अन्य तकनीक तक ही सीमित नहीं है। डिस्पोजेबल पैटर्न पूरे नेट फ्रेमवर्क में पाया जाता है, और जब भी आपके पास IDISposable होता है तो इसका लाभ उठाने के लिए अच्छा अभ्यास माना जाता है अब इसका उपयोग नहीं किया जा रहा है।)
क्यों IDisposable
को पेड़ तक अब तक लागू किया गया है, बजाय आप इसे मामले के आधार पर इसे लागू करने के बजाय ... मैं 100% निश्चित नहीं हूं। लेकिन कल्पना करें कि आप एक ढांचा लिख रहे थे। इस बात पर विचार करें कि अगर सबकुछ एक आईडीस्पोज़ेबल नहीं था, तो आपको जांचना होगा - हर बार जब आप कुछ छुटकारा पाने के लिए चाहते थे! - क्या वस्तु डिस्पोजेबल है, और Dispose
यदि ऐसा है तो। यदि आप इसके बजाय "बस मामले में" IDISposable लागू करते हैं, हालांकि, चीजें सरल हैं - आप बस हमेशा निपटान करते हैं। (यदि किसी ऑब्जेक्ट में साफ करने के लिए कुछ भी नहीं है, तो यह Dispose
को ओवरराइड नहीं करता है - इस स्थिति में उसके माता-पिता के Dispose
को कॉल किया जाता है और जो भी क्लीनअप होता है, जो कुछ भी नहीं हो सकता ...) और यह नियंत्रकों के लिए सामानों को साफ करने के लिए एक आम पर्याप्त मामला है, भले ही यह वास्तविक कारण न हो, फिर भी यह करने के लिए बहुत समझदारी होती है।
आम तौर पर, यदि यह एक 'आईडीस्पोजेबल' है, और आप किसी भी 'आईडीस्पोजेबल' पर हो रहे हैं, तो 'निपटान करें' विधि प्रदान करें। और इसका इस्तेमाल करें। – cHao
मैंने इसके बारे में सुना है ... लेकिन वास्तव में क्यों? क्या सी # में एक कचरा कलेक्टर नहीं है जो एक बार गुंजाइश से बाहर निकलने के बाद अनियंत्रित वस्तुओं को नष्ट कर देता है? तो, वहाँ एक स्पष्ट क्यों है।() विधि जैसे कि asp.net mvc के लिए नियंत्रकों में? और यहां तक कि इकाई फ्रेमवर्क पर भी? यह वास्तव में क्या करता है? –
[सी # अंतिमकरण/निपटान पैटर्न] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern) कृपया IDISposable टैग के लिए शीर्ष उत्तरों देखें (एमवीसी के लिए विशिष्ट कुछ भी नहीं है IDISposable के उपयोग और कार्यान्वयन)। –