2010-07-13 10 views
16

मैं रीशर्पर 5.0 का उपयोग कर रहा हूं, और सोच रहा हूं कि इसका कोड विश्लेषण फ़ंक्शन निम्नलिखित assemblies == null को "अभिव्यक्ति हमेशा झूठा" टिप्पणी के साथ हाइलाइट करने के बारे में जानता है।ReSharper कैसे पता चलता है कि यह रिटर्न प्रकार कभी शून्य नहीं है?

var directory = new DirectoryInfo("somedir"); 
FileInfo[] assemblies = directory.GetFiles("*.dll"); 

if (assemblies == null <<--- this is highlighted with "Expression is always false" 
    || assemblies.Length == 0) 
{ 
    _log.Warn("No assemblies found"); 
} 

मैं समझूंगा कि रिटर्न प्रकार एक मूल्य-प्रकार था, जो यह नहीं है। मैं यह भी समझूंगा कि अगर कुछ प्रकार का कोड अनुबंध था या .GetFiles() बताते हुए मेटाडेटा कभी वापस नहीं आएगा। लेकिन मुझे नहीं लगता कि वहाँ है।

तो - यह कैसे पता है? क्या मुझे कुछ स्पष्ट याद आ रही है, या क्या रीशेपर के पास कुछ विशेषाधिकार प्राप्त ज्ञान है, जैसे ढांचे के तरीकों के बारे में मेटाडेटा की आंतरिक सूची? या यह वास्तव में "आत्मनिरीक्षण" आंतरिक कोड है और इसे बाहर करता है?

+2

वे सिर्फ दस्तावेज़ीकरण को देख सकते थे: "यदि कोई फाइल नहीं है, तो यह विधि एक खाली सरणी लौटाती है।" – stuartd

+11

ओह हाँ, वे सिर्फ omniscienceHelper.ReadDocs() – heisenberg

उत्तर

25

रीशेपर डेवलपर्स ने .NET फ्रेमवर्क बाइनरी पर प्रवाह विश्लेषण चलाया और यह निर्धारित किया कि कौन से तरीके null लौट सकते हैं या नहीं। स्पष्ट रूप से DirectoryInfo.GetFiles कभी भी null लौटाता है।

आप JetBrains. विशेषताओं के सेट के साथ नियमों के एक ही सेट को इंगित करने के लिए अपना कोड एनोटेट कर सकते हैं। ReSharper स्थल पर एक नज़र डालें: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

संपादित करें: विशेष रूप से अपने सवाल का जवाब देने, "ReSharper इस तरह के ढांचे के तरीकों के बारे में मेटाडाटा के एक आंतरिक सूची के रूप में, कुछ विशेषाधिकार प्राप्त ज्ञान है" - हाँ, यह "आत्मनिरीक्षण से आया आंतरिक कोड और इसे काम कर रहा है "

+0

समझ में आता है - उत्तर के लिए धन्यवाद। –

+2

"चेतावनी" का सुझाव है कि आप 'असेंबली == नल' अभिव्यक्ति को हटा दें। हालांकि, अगर इसे लागू कोड को देखकर उत्पन्न किया गया था, तो यह आवश्यक रूप से एक दस्तावेज कोड अनुबंध नहीं है जिसे मैं भरोसा करना चाहता हूं। – intoOrbit

+0

यह आप पर निर्भर है; मैंने अतीत में पर्याप्त समय में रिशेर्पर की चेतावनियों को दोबारा जांच लिया है कि अब मैं भरोसा करता हूं। इसके अलावा, आप कभी भी गारंटी नहीं दे सकते कि सभी संदर्भ प्रकार हर समय गैर-शून्य होंगे, इसलिए हर जगह '== नल' चेक डालने के बजाय, मैं उन्हें छोड़ देता हूं और सुनिश्चित करता हूं कि कोड जितनी जल्दी हो सके विफल हो जाए। –

3

जैसे ही टिम बताते हैं, हम .NET Framework को एनोटेट करते हैं। यह कोड अनुबंधों के साथ आपको मिलता है, लेकिन थोड़ा अलग तरीके से किया जाता है। यदि आप ReSharper स्थापना में बिन फ़ोल्डर के अंतर्गत देखते हैं, तो आप सभी एनोटेशन देख सकते हैं।

+0

@ हादी: कृपया हस्ताक्षर ब्लॉक का उपयोग करने से बचें। आपका गुरुत्वाकर्षण और आपकी प्रोफ़ाइल का एक लिंक पहले से ही प्रत्येक पोस्ट से जुड़ा हुआ है। आप जो भी अतिरिक्त जानकारी अपनी प्रोफ़ाइल में जोड़ना चाहते हैं उसे जोड़ने के लिए स्वतंत्र हैं। –

+0

मैं उत्सुक हूं: आपने उन टिप्पणियों के लिए जानकारी कैसे एकत्र की? क्या आपने बीसीएल बाइनरी के स्थिर विश्लेषण किए हैं, क्योंकि स्वीकृत उत्तर से पता चलता है? या आप इसके बारे में कुछ और तरीके से गए थे? –

+1

@ बिल - मैं ज्यादातर सिग के बारे में आपके बिंदु से सहमत हूं। हालांकि, इस मामले में, यह उस अधिकार को रेखांकित करता है जिसके साथ हादी बोलती है, क्योंकि वह जेटब्रेन के लिए काम करता है। शायद सादे अंग्रेजी में इसे कहने के लिए एक अतिरिक्त रेखा अधिक उपयुक्त हो सकती है, लेकिन सिग ने अपने जवाब में जोड़ा। –

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