2010-05-14 14 views
7

मैं निम्नलिखित कोड है:नल प्रकार और एक ReSharper चेतावनी

private static LogLevel? _logLevel = null; 

public static LogLevel LogLevel 
{ 
    get 
    { 
     if (!_logLevel.HasValue) 
     { 
      _logLevel = readLogLevelFromFile(); 
     } 

     return _logLevel.Value; 
    } 
} 

private static LogLevel readLogLevelFromFile() { ... } 

मैं एक संभव System.InvalidOperationException के बारे में return विवरण पर एक ReSharper चेतावनी मिलती है और यह पता चलता है मैं _logLevel जाँच अगर यह null पहला है देखने के लिए। हालांकि, readLogLevelFromFileLogLevel लौटाता है, LogLevel? नहीं, इसलिए return कथन तक पहुंचने का कोई तरीका नहीं है जब _logLevelnull है। क्या यह रेसर्पर द्वारा सिर्फ एक निरीक्षण है, या क्या मुझे कुछ याद आ रहा है?

+2

मैं इस चेतावनी v4.5 का उपयोग कर नहीं मिलता है। आप रीशेर्पर का किस संस्करण का उपयोग कर रहे हैं? – Brandon

+0

5.0.1659.36 बनाएँ। –

उत्तर

5

यह रिशेर्पर में एक बग जैसा दिखता है।

नोट, हालांकि, यह थ्रेड-सुरक्षित नहीं है।

The best way to do this is to use a static initializer, इस तरह:

public static LogLevel Instance { get { return Nested.level; } } 

class Nested { 
    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Nested() { } 

    internal static readonly LogLevel level = readLogLevelFromFile(); 
} 
+1

जो इसके तत्काल + लोड हो जाएंगे यदि इसका उपयोग – eglasius

+0

पर नहीं किया गया है, तो 'संकेत' प्रतीक को हल नहीं किया जा सकता है। क्या आपका मतलब 'नया नेस्टेड()' करना था? –

+0

@ सराह: मेरा मतलब था '.velvel'। यह अब काम करना चाहिए। – SLaks

4

आप कुछ इस तरह में यह refactor सकता है:

return (_logLevel = _logLevel ?? readLogLevelFromFile()).Value; 

वैकल्पिक रूप से आप आलसी प्रकार में बनाया का उपयोग कर सकते (.NET 4.0 की आवश्यकता है या आप रोल कर सकते हैं अपना खुद का।):

public static LogLevel LogLevel 
{ 
    get { return _logLevel.Value; } 
} 
private static Lazy<LogLevel> _logLevel = new Lazy<LogLevel>(readLogLevelFromFile); 
+0

वह वास्तव में संकलक त्रुटि देता है 'अंतर्निहित रूप से प्रकार' MyNS.LogLevel? 'रूपांतरित नहीं कर सकता 'MyNS.LogLevel' के लिए। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?) '। –

+0

@ सराह - ओपस, मैं 'वैल्यू' पर कॉल भूल गया। – ChaosPandion

+0

यह मेरे पास जितना अधिक कॉम्पैक्ट है; धन्यवाद! –

0

Resharper यो 'के लिए इसे समझने के लिए पर्याप्त' स्मार्ट 'नहीं था यू। यह समझने के लिए एक जटिल बात है, मैं कल्पना करूंगा।

मैं पसंद @ ChaosPandion की पुनर्रचना वैसे भी ...

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