2011-04-20 11 views
8

सी # में, जैसा कि Documentation में उल्लिखित है, और this nice post के स्वीकृत उत्तर में, यह कहा गया है कि कक्षाएं उनके मूल वर्ग के विनाशक का वारिस नहीं करती हैं।बेस क्लास के विनाशक/निपटान का उपयोग करना?

सवाल: मैं आधार वर्ग के निजी तत्वों निपटान के लिए यह सुनिश्चित करना चाहते हैं, तो सभी बच्चे कक्षा में IDisposable लागू करने के लिए उचित तरीके से base.Dispose है, और निपटान विधि में, कॉल ()?

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

+3

कृपया यह केवल तभी करें यदि आपके "निजी तत्व" __unmanaged__ संसाधन हैं। –

+0

@ हेंक: बेस क्लास के "* निजी * तत्व" अप्रबंधित हैं या नहीं, एक कार्यान्वयन विस्तार है कि बाल वर्गों को वास्तव में परवाह नहीं करना चाहिए। यदि आपकी बेस क्लास 'आईडीस्पोजेबल 'लागू करती है तो इसे निपटान किया जाना चाहिए। – LukeH

+0

इस मामले में, बेस क्लास के निजी तत्व वास्तव में अप्रबंधित संसाधन हैं, लेकिन जैसा कि ल्यूकएच ने कहा था, बाल वर्ग इस बारे में 'जागरूक' नहीं हैं। – Tipx

उत्तर

12

MSDN बताता है कि विनाशकों को स्वचालित रूप से बेस कक्षाओं पर बुलाया जाता है।

+0

धन्यवाद निक! मुझे "विनाशकों को विरासत में नहीं मिलाया जा सकता है या अधिभारित नहीं किया जाना चाहिए" से आगे पढ़ना चाहिए था। – Tipx

6

आपको यहां Disposable pattern का पालन करना चाहिए। यह विरासत के लिए भी प्रदान करता है।

यहां दिलचस्प दिलचस्प भाग है "विनाशक विरासत में नहीं हैं", मुझे यकीन नहीं है कि इसका क्या करना है। मैंने थोड़ा परीक्षण लिखा लेकिन मेरी राहत के लिए आपको केवल बेस-क्लास में विनाशक लिखना होगा।

तो बच्चों को बेस-श्रेणी अप्रबंधित संसाधनों से बेकार कर रहे हैं। वे अपने स्वयं के मामलों को साफ करने के लिए Dispose(bool) ओवरराइड कर सकते हैं।

लेकिन मैंने एक टिप्पणी की क्योंकि मैं प्रबंधित संसाधनों को संभालने के लिए पूर्ण पैटर्न को लागू करने वाले बहुत से प्रोग्रामर देखता हूं।

एक सामान्य डिजाइन परिप्रेक्ष्य से, एक डिस्पोजेबल कक्षा बेहतर ढंग से बंद कर दी जाएगी।

+0

धन्यवाद हेनक। मैं आपके द्वारा किए गए पैटर्न के साथ तुलना की गई पैटर्न की तुलना करूंगा, और केवल शुद्धता के लिए आवश्यक समायोजन करूँगा! :-D – Tipx

0

आधार वर्ग आधार वर्ग के लिए standard IDisposable pattern का उपयोग करना चाहिए - इस तरह से केवल आधार वर्ग एक finalizer, और व्युत्पन्न वर्ग की जरूरत है बस आभासी विधि

protected void Dispose(bool disposing) 
0

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

ध्यान दें कि ज्यादातर मामलों में, आधार पर कॉल करें। निपटाना (गलत) कुछ भी नहीं करेगा, लेकिन इसे वैसे भी किया जाना चाहिए। यदि बच्चे वर्ग को अतिरिक्त "अप्रबंधित संसाधन" जोड़ने की आवश्यकता होगी (यानी यदि इसमें अतिरिक्त जिम्मेदारियां हैं जिन्हें अंतिम रूप में निष्पादित करने की आवश्यकता है) तो आम तौर पर उन जिम्मेदारियों को किसी अन्य वस्तु में समाहित करना चाहिए। ध्यान दें कि इस बात का सवाल है कि कक्षा में फाइनेंजर है या नहीं, केवल "कार्यान्वयन विस्तार" है; बेस क्लास में फाइनलाइज़र जोड़ना एक तोड़ने वाला परिवर्तन हो सकता है, जिसके कारण एक प्रोग्राम जो लीक संसाधनों को खराब कर लेता है (बुरा, लेकिन शायद यह जीवित रहता है यदि यह प्रोग्राम एक समय में बहुत लंबे समय तक नहीं चल रहा है) जिसमें यादृच्छिक मौकों पर , संसाधनों को साफ करने का प्रयास जो अभी भी उपयोग में हैं (अक्सर समस्याएं नहीं पैदा करेंगे, लेकिन दुर्लभ लेकिन तत्काल विफलताओं का कारण बन सकते हैं)।

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