में क्या जाना चाहिए मैं Winforms अनुप्रयोग में कुछ मेमोरी लीक मुद्दों को ठीक कर रहा हूं और कुछ डिस्पोजेबल ऑब्जेक्ट्स को देखा है जो स्पष्ट रूप से विस्थापित नहीं हैं (डेवलपर ने निपटान विधि नहीं कहा है)। अंतिमकरण विधि का कार्यान्वयन भी मदद नहीं करता है क्योंकि यह if (disposing)
खंड में नहीं जाता है। सभी स्थैतिक कार्यक्रम अनियंत्रण और संग्रह समाशोधन को if (disposing)
खंड में रखा गया है। सबसे अच्छा अभ्यास निपटान को बुला रहा है अगर ऑब्जेक्ट डिस्पोजेबल है, लेकिन दुर्भाग्य से यह कभी-कभी होता हैआईडीस्पोजेबल कार्यान्वयन - 'अगर (निपटान)'
यदि अप्रबंधित ऑब्जेक्ट्स, स्थैतिक ईवेंट हैंडलर और कुछ प्रबंधित संग्रह जिन्हें डिस्पोजेक्ट करते समय साफ़ करने की आवश्यकता होती है। यह तय करने का तरीका क्या है कि if (disposing)
खंड में क्या जाना चाहिए और क्या जाना चाहिए।
// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
It says प्रबंधित वस्तुओं जो आम तौर पर केवल कार्यान्वित जब स्पष्ट रूप से डेवलपर द्वारा निपटान विधि कॉल if (disposing)
में करना चाहिए। यदि अंतिम विधि लागू की गई है और डेवलपर निपटान विधि को कॉल करने के लिए भूल जाता है तो अंतिमकरण के माध्यम से यहां आने वाले निष्पादन if (disposing)
अनुभाग में नहीं जाते हैं।
नीचे मेरे प्रश्न हैं।
यदि मेरे पास स्थिर घटना हैंडलर हैं जो मेमोरी लीक का कारण बनता है तो मुझे उन्हें पंजीकृत क्यों करना चाहिए?
if (disposing)
खंड में या बाहर?यदि मेरे पास कुछ संग्रह हैं जो मेमोरी लीक का कारण बनते हैं तो मुझे उन्हें साफ़ करना चाहिए?
if (disposing)
खंड में या बाहर?यदि मैं तृतीय पक्ष डिस्पोजेबल ऑब्जेक्ट्स (उदाहरण: devExpress Winform नियंत्रण) का उपयोग कर रहा हूं, तो मुझे यकीन नहीं है कि वे प्रबंधित या अप्रबंधित ऑब्जेक्ट्स हैं या नहीं। मान लें कि मैं एक फॉर्म का निपटान करते समय उन्हें निपटाना चाहता हूं। मैं कैसे जान सकता हूं कि प्रबंधित क्या हैं और गैर-प्रबंधित वस्तुओं क्या हैं? डिस्पोजेबल होने के नाते यह नहीं कहता है? ऐसे मामलों में यह तय करने के लिए कि क्या जाना चाहिए और
if (disposing)
खंड से क्या बाहर जाना चाहिए?यदि मुझे यकीन नहीं है कि कुछ प्रबंधित या अप्रबंधित है तो
if (disposing)
खंड से बाहर निकालने/समाशोधन/अनियंत्रित घटनाओं के खराब परिणाम क्या हो सकते हैं? मान लीजिए कि यह निपटान से पहले शून्य के लिए जाँच करता है?
संपादित
क्या मैं घटना संयुक्त राष्ट्र से पंजीकृत कराने के रूप में मतलब नीचे की तरह कुछ है। प्रकाशक एक लंबे समय तक रहने वाला उदाहरण है और नीचे की रेखा ग्राहक के निर्माता में है। इस मामले में ग्राहक को घटना को अपंजीकृत करने और प्रकाशक के सामने निपटान करने की आवश्यकता है।
publisher.DoSomeEvent += subscriber.DoSomething;
स्थिर घटनाओं की सदस्यता लेने के उदाहरणों के लिए यह बिल्कुल असामान्य नहीं है। ऐसे मामलों को अगर (निपटान) खंड के भीतर सदस्यता समाप्त करनी चाहिए। – supercat