2012-02-07 10 views
10

मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जो रिपोर्टिंग के लिए क्रिस्टल रिपोर्ट का उपयोग करता है। यह एक रिपोर्ट डॉक्यूमेंट ऑब्जेक्ट में एक दी गई रिपोर्ट खोलता है, जो करता है उसे करता है और फिर रिपोर्ट बंद कर देता है।क्रिस्टल रिपोर्ट्स रिपोर्ट डॉक्यूमेंट ऑब्जेक्ट द्वारा उपयोग किए जाने वाले संसाधनों को साफ़ करने का सबसे अच्छा तरीका क्या है?

using (var report = OpenReport(reportSourceInfo)) 
{ 
    // Do stuff with the report 
    report.Close(); 
} 

OpenReport विधि स्रोत फ़ाइल से कुछ सत्यापन करता है और एक खुले ReportDocument वस्तु देता है।

परीक्षण से पता चला है कि यह कोड करता है जो इसका मतलब है और इसमें कोई समस्या नहीं है।

CA2202: Microsoft.Usage: ऑब्जेक्ट 'रिपोर्ट' हो सकता है समस्या मैं वास्तव में के बारे में सलाह के बाद कर रहा हूँ जब मैं एक कोड विश्लेषण (CA) रिपोर्टिंग परियोजना के निर्माण करते हैं, मैं निम्नलिखित सीए संदेश मिलता है विधि 'CrystalReportingProvider.ReportExecute (ReportSourceInformation)' में एक से अधिक बार निपटान किया गया। एक सिस्टम उत्पन्न करने से बचने के लिए। ऑब्जेक्ट डिस्प्ले अपवाद जिसे आप कॉल नहीं करना चाहिए किसी ऑब्जेक्ट पर एक से अधिक बार निपटाना।

अब स्पष्ट रूप से मैं चारों ओर कोड बदल सकता हूं इसलिए मुझे यह सीए चेतावनी नहीं मिलती है, लेकिन मेरा सवाल है?

क्या क्रिस्टल रिपोर्ट रिपोर्ट Document.Close() विधि संसाधन सफाई को ठीक से संभालने के लिए सब कुछ करती है? संदेश इंगित करता है कि बंद विधि निपटान विधि को कॉल करती है, लेकिन यह सही नहीं लगती है।

किसी भी सलाह की सराहना की जाएगी।

उत्तर

1

ठीक है, this के अनुसार, "बंद करें() ... रिपोर्ट द्वारा उपयोग की जाने वाली स्मृति को रिलीज़ करें।" इससे संकेत मिलेगा कि बंद() कॉल निपटान(), इसलिए यह एक उपयोग कथन और बंद() दोनों के लिए अनावश्यक होगा।

+0

यह कोडिंग सम्मेलन के चेहरे पर उड़ने लगता है कि यदि आप किसी ऑब्जेक्ट के साथ समाप्त हो गए हैं जिसका प्रकार IDISposable लागू करता है तो आपको इसे निपटान() पर कॉल करना चाहिए, वैकल्पिक रूप से आपको यह – Fooksie

+0

करने के लिए उपयोग करने वाले ब्लॉक का उपयोग करना चाहिए। असेंबली और पाया कि बंद निपटान कॉल नहीं करता है। – LostInComputer

3

हालांकि स्मृति के उचित उपयोग से संबंधित वेब पर उपलब्ध जानकारी का एक बड़ा सौदा है और उदाहरण के लिए MSDN:IDisposable.Dispose या Stackoverflow:Disposing and Setting to null पर कार्य पूर्ण होने पर संबंधित स्मृति की संबंधित सफाई है। यह प्रचलित कोडिंग सम्मेलन को जन्म देता है कि यदि आप निपटान कर सकते हैं, तो ऐसा करें।

यह सम्मेलन FileStreams और SqlDataReader (दूसरों के बीच) जैसी वस्तुओं के लिए सच है जहां आपके पास बंद और निपटान विधियों दोनों हैं, और कॉलिंग को बंद करें कॉल को बंद करें।

जो मैंने ध्यान में नहीं लिया वह "क्रिस्टल फैक्टर" था। उन्हें पसंद है या उन्हें नफरत है, वे चीजें करते हैं ... अलग-अलग। इस SAP SDN article के दूसरे जवाब में ऑनलाइन बहुत अधिक खोज करने के बाद, एक एसएपी कर्मचारी बंद विधि का कोड पोस्ट करना प्रतीत होता है। जैसा कि आप देख सकते हैं, रिपोर्ट डॉक्यूमेंट ऑब्जेक्ट वाले सभी तत्वों को समाशोधन और निपटाने के बाद, यह ReportDocument.Dispose विधि भी कॉल करता है।

उन सभी के बावजूद, और बिना किसी विधि के निपटान विधि को लागू किए जाने के बावजूद (ठीक से आप मान लेंगे कि कोड अपने वर्तमान रूप में काम करता है), आपको उचित सम्मेलन में कोड करना चाहिए और निपटान विधि को कॉल करना चाहिए या इसे घोषित करना चाहिए कथन का प्रयोग करना बस सीए चेतावनी दबाओ।

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