Warum erhalte ich Code-Analyse-CA1062 auf out-Parameter in diesem Code?
-
30-09-2019 - |
Frage
Ich habe einen sehr einfachen Code (aus dem ursprünglichen Code vereinfachte - so dass ich weiß, es ist nicht ein sehr kluger Code), dass, wenn ich in Visual Studio 2010 mit Code-Analyse kompilieren gibt mir Warnung CA1062: Validate Argumente der öffentlichen Methoden
public class Foo
{
protected static void Bar(out int[] x)
{
x = new int[1];
for (int i = 0; i != 1; ++i)
x[i] = 1;
}
}
Die Warnung erhalte ich:
CA1062: Microsoft.Design: In extern sichtbare Methode ‚Foo.Bar (out int [])‘, validate lokaler Variable '(* X)', die neu zugewiesen wurden aus Parameter 'x', bevor Sie es.
Ich verstehe nicht, warum ich diese Warnung erhalten und wie kann ich es beheben, ohne sie zu unterdrücken? Kann Rückkehr new
null
? Ist das ein Visual Studio 2010 Bug?
UPDATE
Ich habe zu öffnen entschieden ein Fehlerbericht auf Microsoft Connect .
Lösung
Ich habe das reproduzierte in Visual Studio 2010 Premium mit dem Code genau wie angegeben und mit Microsoft Alle Regeln aktiviert in den Analyseeinstellungen.
Es sieht aus wie dies ein Fehler ist (siehe hier unten: http: / /msdn.microsoft.com/en-us/library/ms182182.aspx ). Es ist complainng, dass Sie nicht, dass x
Überprüfung vor der Verwendung nicht null ist, aber es ist auf out
Parametern so gibt es keinen Eingabewert zu überprüfen!
Andere Tipps
Es ist einfacher, zu zeigen, als zu beschreiben:
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;
}
}
}
Und der richtige Weg ist:
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;
}