संक्षिप्त उत्तर है: वहाँ संकेत है कि वस्तु कहीं निपटारा किया जा रहा है कोई रास्ता नहीं है।
थोड़ा सा प्रतिबिंबक (या डॉटपीक-आईएनजी, या जो कुछ भी) बताता है क्यों।
FxCop C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop
में है। (अपने ओएस/वीएस संस्करण कॉम्बो के अनुसार तदनुसार समायोजित करें।) नियम Rules
उपनिर्देशिका में हैं।
मुख्य FxCop
फ़ोल्डर में, खुली
Microsoft.VisualStudio.CodeAnalysis.dll
Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll
phx.dll
Rules
फ़ोल्डर में, खुली DataflowRules.dll
।
DataflowRules.dll
Phoenix.CodeAnalysis.DataflowRules.DisposeObjectsBeforeLosingScope
पर खोजें। वह वास्तविक वर्ग है जो मूल्यांकन करता है।
वहां कोड को देखते हुए, आप अपने प्रश्न के संबंध में रुचि के दो चीजें देख सकते हैं।
- यह का उपयोग करता है एक साझा सेवा
SharedNeedsDisposedAnalysis
कहा जाता है।
- यह
FunctionBodyRule
से निकला है।
पहला आइटम दिलचस्प है क्योंकि SharedNeedsDisposedAnalysis
क्या निर्धारित करता है जो प्रतीकों Dispose()
कहा जाता है की जरूरत है। यह बहुत अच्छी तरह से है, यह निर्धारित करने के लिए कोड के माध्यम से "चलना" कर रहा है कि क्या निपटान की आवश्यकता है और वास्तव में क्या निपटान किया जाता है। यह बाद में उपयोग के लिए उन चीजों की एक तालिका रखता है।
दूसरे मद दिलचस्प है क्योंकि FunctionBodyRule
नियम एक भी समारोह के शरीर का मूल्यांकन। अन्य नियम प्रकार हैं, जैसे FunctionCallRule
जो फ़ंक्शन कॉल सदस्यों (उदा। ProvideCorrectArgumentsToFormattingMethods
) जैसी चीजों का मूल्यांकन करते हैं।
बिंदु है, कि SharedNeedsDisposedAnalysis
सेवा में संभावित "याद आती है" जहां यह अपने विधि के माध्यम से recursing जा नहीं हो सकता है देखने के लिए है कि चीजें वास्तव में निपटारा किया जा रहा है और FunctionBodyRule
की सीमा समारोह शरीर से परे नहीं जा रहा के बीच, यह सिर्फ है अपना विस्तार नहीं पकड़ रहा है।
यह वह जगह है इसी कारण "गार्ड कार्यों" इससे पहले कि आप इसका इस्तेमाल करते हैं जैसे कभी नहीं तर्क मान्य के रूप में देखा हो - FxCop अभी भी अशक्त के लिए तर्क की जाँच करने के आपको बता देंगे, भले ही है कि "गार्ड समारोह" क्या कर रहा है है ।
आपके पास मूल रूप से दो विकल्प हैं।
- समस्याएं बहिष्कृत करें या नियम बंद करें। ऐसा कोई तरीका नहीं है जो आप चाहते हैं।
- एक कस्टम/व्युत्पन्न नियम बनाएं जो विस्तार विधियों को समझ सके। डिफ़ॉल्ट नियम के स्थान पर अपने कस्टम नियम का उपयोग करें।
लिखा कस्टम FxCop अपने आप नियम होने के बाद, मैं तुम्हें पता है मुझे मिल गया ... गैर तुच्छ दूँगा। यदि आप उस सड़क पर जाते हैं, जबकि दुनिया में सिफारिश नई फीनिक्स इंजन नियम शैली का उपयोग करना है (यही वर्तमान DisposeObjectsBeforeLosingScope
उपयोग करता है), मुझे पुराने/मानक FxCop SDK नियमों को समझना आसान लगता है (FxCopSdk.dll
देखें मुख्य FxCop फ़ोल्डर)। परावर्तक यह पता लगाने में एक बड़ी मदद करेंगे कि ऐसा कैसे करें क्योंकि इसमें बहुत अधिक शून्य दस्तावेज़ है। उन उदाहरणों को देखने के लिए Rules
फ़ोल्डर में अन्य असेंबली में देखें।
आप नमूना कहते हैं 'this.privateMember.Dispose()'। क्या आपका कोड वास्तव में 'this.privateMember.SafeDispose() 'कहता है? –