2010-05-18 55 views
6

我有一個非常簡單的代碼(從原始代碼簡化 - 所以我知道這不是一個非常聰明的代碼),當我在代碼分析的Visual Studio 2010中編譯時,我警告CA1062:驗證公共方法的參數。爲什麼我在代碼中的out參數上得到代碼分析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(下 INT [])',驗證局部變量 「(* X )',在使用前從 參數'x'重新分配。

我不明白爲什麼我會得到這個警告,我該如何解決它而不壓制它? new可以返回null?這是一個Visual Studio 2010錯誤?

UPDATE

我決定開a bug report on Microsoft Connect

+0

我不知道這個問題是在別處...... – 2010-05-18 20:42:38

+0

再沒有攝製。沒有什麼可以驗證的。您已發佈其他代碼分析警告,不會重新制作。如果你做了任何配置更改,那麼一定要記錄它們。 – 2010-05-18 20:46:37

+0

@Hans Passant,你確定你正在運行Visual Studio 2010中的所有微軟代碼分析規則嗎? – brickner 2010-05-18 20:48:17

回答

8

我已經在Visual Studio 2010 Premium中重現了這一點,代碼與給出的代碼完全相同,並且在分析設置中啓用了微軟所有規則

它看起來像這是一個錯誤(見這裏的底部: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

好的,但爲什麼正確的方法是正確的?或者你說這是正確的,因爲代碼分析中沒有提示警告? – 2010-05-18 21:06:53

+0

你已經展示的當然是一個重要的觀點(如果x可能被多個線程訪問),但我不認爲這是CA1062打算強調的。如果你閱讀這裏的文檔:http://msdn.microsoft.com/en-us/library/ms182182.aspx,很明顯這是用於'ref'參數,只是一個標準「在使用它之前檢查它不是空的「 規則。這是一個錯誤,它被應用於'out'參數。這實際上是否會阻止CA1062警告? – 2010-05-18 21:07:08

+0

@gmagana:正確的方法是線程安全的,不管拋出NullReferenceException如何。 – Diadistis 2010-05-18 21:13:25

相關問題