2010-05-18 10 views
6

मेरे पास एक बहुत ही सरल कोड है (मूल कोड से सरलीकृत - इसलिए मुझे पता है कि यह एक बहुत चालाक कोड नहीं है) जब मैं कोड विश्लेषण के साथ विजुअल स्टूडियो 2010 में संकलित करता हूं तो मुझे चेतावनी देता है CA1062: सार्वजनिक तरीकों के तर्कों की पुष्टि करें।मुझे इस कोड में आउट पैरामीटर पर कोड विश्लेषण CA1062 क्यों मिलता है?

public class Foo 
{ 
    protected static void Bar(out int[] x) 
    { 
     x = new int[1]; 
     for (int i = 0; i != 1; ++i) 
      x[i] = 1; 
    } 
} 

चेतावनी मैं:

CA1062: Microsoft.Design: बाहर से दिखाई देने विधि में 'Foo.Bar (बाहर पूर्णांक [])', स्थानीय चर मान्य '(* x) ', जिसे इसका उपयोग करने से पहले पैरामीटर' एक्स 'से पुनः सौंपा गया था।

मुझे समझ में नहीं आता कि मुझे यह चेतावनी क्यों मिलती है और इसे दबाए बिना मैं इसे कैसे हल कर सकता हूं? new वापसी null कर सकते हैं? क्या यह एक विजुअल स्टूडियो 2010 बग है?

अद्यतन

मैं a bug report on Microsoft Connect खोलने का निर्णय लिया गया है।

+0

मुझे आश्चर्य है अगर समस्या कहीं और फिर कोई रेप्रो है ... –

+0

। प्रमाणित करने के लिए कुछ भी नहीं है। आपने अन्य कोड विश्लेषण चेतावनियां पोस्ट की हैं जो repro नहीं करते हैं। यदि आपने कोई कॉन्फ़िगरेशन परिवर्तन किया है तो उन्हें दस्तावेज़ित करना सुनिश्चित करें। –

+0

@ हंस पासेंट, क्या आप वाकई विजुअल स्टूडियो 2010 में सभी माइक्रोसॉफ्ट कोड विश्लेषण नियम चला रहे हैं? – brickner

उत्तर

8

मैंने विजुअल स्टूडियो 2010 प्रीमियम में इसे ठीक से कोड के साथ पुन: प्रस्तुत किया है और माइक्रोसॉफ्ट ऑल नियम विश्लेषण सेटिंग्स में सक्षम है।

ऐसा लगता है कि यह एक बग है (यहां देखें: http://msdn.microsoft.com/en-us/library/ms182182.aspx)। यह शिकायत कर रहा है कि आप यह जांच नहीं कर रहे हैं कि x इसका उपयोग करने से पहले शून्य नहीं है, लेकिन यह out पैरामीटर पर है इसलिए जांच करने के लिए कोई इनपुट मान नहीं है!

5

यह वर्णन करने के लिए की तुलना में दिखाने के लिए आसान है:

public class Program 
{ 
    protected static int[] testIntArray; 

    protected static void Bar(out int[] x) 
    { 
     x = new int[100]; 
     for (int i = 0; i != 100; ++i) 
     { 
      Thread.Sleep(5); 
      x[i] = 1; // NullReferenceException 
     } 
    } 

    protected static void Work() 
    { 
     Bar(out testIntArray); 
    } 

    static void Main(string[] args) 
    { 
     var t1 = new Thread(Work); 
     t1.Start(); 

     while (t1.ThreadState == ThreadState.Running) 
     { 
      testIntArray = null; 
     } 
    } 
} 

और सही तरीका है:

protected static void Bar(out int[] x) 
    { 
     var y = new int[100]; 

     for (int i = 0; i != 100; ++i) 
     { 
      Thread.Sleep(5); 
      y[i] = 1; 
     } 

     x = y; 
    } 
+0

ठीक है, लेकिन सही तरीका सही क्यों है? या आप कहते हैं कि यह सही है क्योंकि कोड विश्लेषण में कोई चेतावनी नहीं दी गई है? –

+0

जो आपने दिखाया है वह निश्चित रूप से एक महत्वपूर्ण बिंदु है (यदि एक्स को एकाधिक धागे से एक्सेस किया जा सकता है) लेकिन मुझे नहीं लगता कि सीए 1062 का उद्देश्य हाइलाइट करना है। यदि आप यहां प्रलेखन पढ़ते हैं: http://msdn.microsoft.com/en-us/library/ms182182.aspx, यह स्पष्ट है कि यह 'रेफरी पैरामीटर' के लिए है और यह केवल एक मानक है "इसे प्रयोग करने से पहले यह शून्य नहीं है "नियम। यह एक बग है कि इसे 'आउट' पैरामीटर पर लागू किया जा रहा है। क्या यह वास्तव में CA1062 चेतावनी को रोकता है? –

+0

@gmagana: सही तरीका धागा सुरक्षित है और इससे कोई फर्क नहीं पड़ता कि NullReferenceException फेंक नहीं देगा। – Diadistis

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