2010-12-08 14 views
7

चेतावनी यहाँ निकालने का तरीका कोड का एक टुकड़ा है:ReSharper: "संभावित 'System.NullReferenceException'"

 IUser user = managerUser.GetUserById(UserId); 
     if (user==null) 
      throw new Exception(...); 

     Quote quote = new Quote(user.FullName, user.Email); 

यहाँ सब कुछ ठीक है। लेकिन अगर मैं की जगह "अगर" के बाद एक साथ कतार:

 ComponentException<MyUserManagerException>.FailIfTrue(user == null, "Can't find user with Id=" + UserId); 

जहां समारोह कार्यान्वयन पीछा कर रहा है: संभावित 'System.NullReferenceException' 1 के उपयोग पर ओर इशारा करते हुए:

public abstract class ComponentException<T> : ComponentException 
     where T : ComponentException, new() 
{ 
    public static void FailIfTrue(bool expression, string message) 
    { 
     if (expression) 
     { 
      T t = new T(); 
      t.SetErrorMessage(message); 
      throw t; 
     } 
    } 
    ... 
} 

फिर ReSharper मुझे एक चेतावनी उत्पन्न करता है 'उपयोगकर्ता' ऑब्जेक्ट का।

क्यू 1। यह ऐसा अपवाद क्यों उत्पन्न करता है? जहां तक ​​मैं देखता हूं कि 'user == null' है तो अपवाद उत्पन्न होगा और निष्पादन कभी भी उपयोग बिंदु तक नहीं पहुंच पाएगा।

प्रश्न 2। उस चेतावनी को कैसे हटाएं? कृपया ध्यान दें: 1. मैं इस चेतावनी को टिप्पणियों के साथ दबाना नहीं चाहता हूं (मेरे पास बहुत सारे टुकड़े होंगे और मेरे स्रोत कोड को 'टिप्पणी किए गए कचरे में बदलना नहीं चाहते हैं); 2. मैं इस समस्या को चेतावनी से 'संकेत' के 'सुझाव' में बदलने के लिए resharper सेटिंग्स को बदलना नहीं चाहता।

धन्यवाद।

किसी भी विचार का स्वागत है!

पीएस मैं resharper 5.1, एमवीएसवी 2008, सी #

उत्तर

6

प्रश्न 1 का उपयोग कर रहा हूं: क्योंकि रिशेर्पर पथ विश्लेषण नहीं करता है। यह सिर्फ एक संभावित null संदर्भ और झंडे देखता है।

प्रश्न 2: आप जो भी पहले से प्रदान किए गए हैं, उसके बिना आप नहीं कर सकते हैं।

0

यह रिशेर्पर इंजन के कारण होता है। ये "संभावित NullReferenceException" ऐसा इसलिए होता है क्योंकि किसी (शायद Resharper पर) विधि पर कहीं एनोटेशन घोषित/कॉन्फ़िगर किया गया है।

यह ऐसे काम करता है: ReSharper NullReferenceException Analysis and Its Contracts

दुर्भाग्य से, कभी कभी, इन उपयोगी एनोटेशन सिर्फ गलत हैं।

जब आपको कोई त्रुटि मिलती है, तो आपको जेटब्रेन में इसकी रिपोर्ट करनी चाहिए और वे अगली रिलीज पर एनोटेशन अपडेट करेंगे। उनका उपयोग इस पर किया जाता है।

इस बीच, आप इसे स्वयं ठीक करने का प्रयास कर सकते हैं। अधिक लेख के लिए लेख पढ़ें :)

10

रिशेर्पर केवल अपने विश्लेषण के लिए वर्तमान विधि को देखता है, और आपके द्वारा कॉल की जाने वाली अन्य विधियों का पुन: विश्लेषण नहीं करता है।

हालांकि आप थोड़ी देर रिशेर्पर को निर्देशित कर सकते हैं और कुछ तरीकों के बारे में मेटा-सूचना दे सकते हैं। यह उदाहरण के लिए "Assert.IsNotNull (ए)" के बारे में जानता है, और विश्लेषण के लिए उस जानकारी को ध्यान में रखेगा। Resharper के लिए बाहरी एनोटेशन फ़ाइल बनाना संभव है और इसे अपने विश्लेषण को बेहतर बनाने के लिए एक निश्चित लाइब्रेरी के बारे में अतिरिक्त जानकारी दें। शायद यह आपकी समस्या को हल करने का एक तरीका प्रदान कर सकता है।

अधिक जानकारी here मिल सकती है।

एक उदाहरण दिखाता है कि माइक्रोसॉफ्ट लाइब्रेरी के लिए इसका उपयोग कैसे किया जाता है।अनुबंध here पाया जा सकता है।

3

आप अगर वहाँ एक अशक्त संदर्भ है (या उम्मीद) है कि इस कोड एक अपवाद फेंक देगा:

ComponentException<MyUserManagerException>.FailIfTrue([...]); 

हालांकि, बाद से वहाँ कोई इस को निर्दिष्ट अनुबंध है, ReSharper ग्रहण करने के लिए कि यह सिर्फ है एक सामान्य विधि कॉल जो किसी भी मामले में कोई अपवाद फेंकने के बिना वापस आ सकती है।

मेक इस विधि ReSharper अनुबंध को लागू, या एक सरल समाधान का, (जो केवल डिबग मोड, रिलीज़ मोड के लिए इसलिए कोई प्रदर्शन की सजा को प्रभावित करता है) के तुरंत बाद FailIfTrue कॉल के रूप में:

Debug.Assert(user != null); 

छुटकारा मिल जाएगा कि चेतावनी का, और एक अतिरिक्त बोनस के रूप में FailIfTrue पर कॉल करने के बाद आपके द्वारा ग्रहण की गई शर्त को सुनिश्चित करने के लिए डीबग मोड में रनटाइम चेक करें।

+0

मैं कामना की कि यह सच था है ... Resharper 5.1 सही ढंग से 'Debug.Assert की पहचान करने में विफल रहता है (उपयोगकर्ता = अशक्त!);' और चेतावनी को जन्म देती है। क्या मुझे कोई विन्यास करने की ज़रूरत है? –

+0

उह, आर # 5.1 काफी पुराना है, इसलिए मेरे पास आपकी समस्या का परीक्षण करने के लिए कुछ भी नहीं है। कुछ संकेत हालांकि: सुनिश्चित करें कि आपका कोड 'System.Diagnostics.Debug' वर्ग को सही ढंग से संदर्भित करता है क्योंकि कोड अनुबंध उस के लिए परिभाषित किया गया था, और उस नाम/हस्ताक्षर के साथ मनमानी तरीकों के लिए नहीं। साथ ही, सुनिश्चित करें कि बिल्ड कॉन्फ़िगरेशन डीबग पर सेट है (अन्यथा कोड दायरे से बाहर है और इसलिए चेतावनी पॉप अप हो जाती है!)। – Lucero

+0

'Debug.Assert' काम करता है, लेकिन केवल डीबग मोड में। –

4

पुराने पोस्ट में एक नया उत्तर ...

यहाँ मेरी कोड का एक छोटा नमूना Resharper साथ ContractAnnotation के माध्यम से CodeContract का उपयोग कैसे करें के बारे में:

[ContractAnnotation("value:null=>true")] 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 

यह बहुत ही सरल ... यदि u है लकड़ी में ब्रेडक्रंब पाएं। आप अन्य मामलों की भी जांच कर सकते हैं।

एक अच्छा दिन

+1

यदि आप जानते हैं कि एक विधि हमेशा अपवाद फेंकता है तो आप '[अनुबंध एन्नोटेशन ("=> रोक") कर सकते हैं] ' – Dejan

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