आप Dispose
लागू करने के लिए पारंपरिक पैटर्न का पालन करना चाहिए। Dispose()
वर्चुअल को खराब अभ्यास माना जाता है, क्योंकि पारंपरिक पैटर्न "प्रबंधित क्लीनअप" (एपीआई क्लाइंट को Dispose()
पर सीधे या using
) और "अप्रबंधित क्लीनअप" (जीसी कॉलिंग फ़ाइनलाइज़र) के माध्यम से कोड के पुन: उपयोग पर जोर देता है। याद दिलाने के लिए, पैटर्न यह है:
public class Base
{
~Base()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // so that Dispose(false) isn't called later
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose all owned managed objects
}
// Release unmanaged resources
}
}
कुंजी यहाँ अप्रबंधित सफाई के लिए finalizer और Dispose
के बीच कोई दोहराव नहीं है, और अभी तक किसी भी व्युत्पन्न वर्ग दोनों प्रबंधित और अप्रबंधित सफाई का विस्तार कर सकते हैं।
protected abstract void Dispose(bool disposing)
और बाकी सब कुछ छोड़ के रूप में:
अपने मामले के लिए, आप क्या करना चाहिए यह है। यहां तक कि यह संदिग्ध मूल्य है, क्योंकि आप अब अपने व्युत्पन्न वर्गों को Dispose
लागू करने के लिए लागू कर रहे हैं - और आप कैसे जानते हैं कि उन सभी को इसकी आवश्यकता है? यदि आपकी बेस क्लास का निपटान करने के लिए कुछ भी नहीं है, लेकिन अधिकतर व्युत्पन्न कक्षाएं संभवतः (कुछ अपवादों के साथ) कर सकती हैं, तो बस खाली कार्यान्वयन प्रदान करें। यह System.IO.Stream
(स्वयं सार) है, इसलिए उदाहरण है।
स्रोत
2009-11-09 20:54:13
आपको अपने इंटरफ़ेस में निपटान() जोड़ने की आवश्यकता क्यों है? यदि इसे IDISposable से विरासत में मिला है तो निपटान() विधि पहले से ही आपके इंटरफ़ेस का हिस्सा है। –
सेठ, आपको सभी इंटरफेस सदस्यों को लागू करना होगा। इसे छोड़ना संकलित नहीं होगा। पैटर्न का उल्लेख करने के लिए –