2008-11-01 4 views
28

Ich bin mir nicht sicher, warum ich diesen Fehler erhalte, aber sollte dieser Code nicht kompiliert werden, da ich bereits überprüfe, ob die Warteschlange initialisiert wird?C# -Fehler: Verwendung der nicht zugewiesenen lokalen Variablen

public static void Main(String[] args) 
{ 
    Byte maxSize; 
    Queue queue; 

    if(args.Length != 0) 
    { 
     if(Byte.TryParse(args[0], out maxSize)) 
      queue = new Queue(){MaxSize = maxSize}; 
     else 
      Environment.Exit(0); 
    } 
    else 
    { 
     Environment.Exit(0); 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
     queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
     Console.WriteLine(queue.Remove()); 
} 

Also wenn Warteschlange nicht initialisiert ist, dann sind die for-Schleifen nicht erreichbar richtig? Da das Programm bereits mit Environment.Exit (0) beendet wird?

Hoffnung YA'LL mir einige Hinweise :)

Dank geben kann.

+6

Ich kann Ihnen keine Hinweise geben, aber ich hoffe, Sie können diesen Punkt in den Griff bekommen. – wprl

Antwort

73

Der Compiler weiß nicht, dass Environment.Exit() das Programm beenden wird; Sie sehen nur, dass Sie eine statische Methode für eine Klasse ausführen. Initialisieren Sie einfach queue auf Null, wenn Sie es deklarieren.

9

Der Compiler weiß nicht, dass Environment.Exit() nicht zurückgibt. Warum nicht einfach von Main() zurückkehren?

+0

Ich bevorzuge die Verwendung von Environment.Exit mit einem Fehlerstatus ungleich Null für den Fall, dass das Programm von einem Skript aufgerufen wird.Auf diese Weise kann das Skript durch Überprüfen des Exit-Status feststellen, ob das Programm erfolgreich war oder nicht. – tvanfosson

+4

Ändern Sie den Rückgabetyp von main in int und geben Sie den Status zurück. –

0

Der Compiler weiß nur, dass der Code erreichbar ist oder nicht erreichbar ist, wenn Sie "return" verwenden. Stellen Sie sich Environment.Exit() als eine Funktion vor, die Sie aufrufen, und der Compiler weiß nicht, dass die Anwendung geschlossen wird.

+0

Ich kann an zwei andere Quellen für unerreichbaren Code denken: Break oder in einer Schleife weiter und werfen :) –

+0

Das stimmt. Ich habe mich auf diese spezifische Frage bezogen, aber danke für die Klarstellung, es könnte zu einer Fehlinterpretation führen. –

8

Ein paar verschiedene Möglichkeiten, um das Problem zu lösen:

Gerade Environment.Exit mit Rückkehr ersetzen. Der Compiler weiß, dass return die Methode beendet, aber nicht weiß, dass Environment.Exit das tut.

Natürlich können Sie wirklich nur damit durchkommen, weil Sie in allen Fällen 0 als Ihren Exit-Code verwenden. Eigentlich sollten Sie einen int zurückgeben, anstatt Environment.Exit zu verwenden. Für diesen speziellen Fall würde dies meine bevorzugte Methode

static int Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return 1; 
    } else { 
     return 2; 
    } 
} 

initialisieren Warteschlange zu null sein, die wirklich nur ein Compiler Trick ist, der sagt: „Ich werde meine eigenen nicht initialisierten Variablen herauszufinden, vielen Dank“. Es ist ein nützlicher Trick, aber ich mag es in diesem Fall nicht - Sie haben zu viele Zweige, um leicht zu überprüfen, ob Sie es richtig machen. Wenn Sie wirklich wollten es auf diese Art und Weise zu tun, wie etwas, das wäre klarer sein:

static void Main(string[] args) { 
    Byte maxSize; 
    Queue queue = null; 

    if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) { 
    Environment.Exit(0); 
    } 
    queue = new Queue(){MaxSize = maxSize}; 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 

eine return-Anweisung nach Environment.Exit hinzufügen. Auch dies ist eher ein Compiler Trick - aber etwas mehr legit IMO, weil es auch Semantik für den Menschen hinzufügt (wenn man davon aus, dass gepriesene 100% Code Coverage halten werden)

static void Main(String[] args) { 
    if(args.Length != 0) { 
    if(Byte.TryParse(args[0], out maxSize)) { 
     queue = new Queue(){MaxSize = maxSize}; 
    } else { 
     Environment.Exit(0); 
     return; 
    } 
    } else { 
    Environment.Exit(0); 
    return; 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 
+0

Danke für die sehr informative Post. – jkidv

-4

SqlConnection con; SqlCommand com; con = neue SqlConnection ("Datenquelle =. \ SQLEXPRESS; AttachDbFilename =" + Server.MapPath ("~ \ App_Data \ Database.mdf") + "; Integrierte Sicherheit = True; Benutzerinstanz = True"); con.Open();

com = new SqlCommand("insert into blog values(@b)", con); 
    //com.Parameters.AddWithValue("@a", TextBox1.Text); 
    com.Parameters.AddWithValue("@b",TextBox2.Text); 
    com.ExecuteNonQuery(); 
    con.Close(); 
    TextBox1.Visible = true; 
    SqlDataReader DR1; 

    while (DR1.Read()) 
    { 
     TextBox1.Text = DR1[1].ToString(); 
    } 

der Fehler kommt, die nicht zugewiesenen lokalen Variablen verwenden.