Frage

Ich bin mir nicht sicher, warum ich diesen Fehler bin immer, soll aber nicht dieser Code Kompilierung, da ich bereits sehen bin Überprüfung, ob Warteschlange initialisiert zu werden?

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 ist die for-Schleifen sind nicht erreichbar oder? Da das Programm endet bereits mit Environment.Exit (0)?

Hoffnung YA'LL geben kann mir einige Hinweise:)

Danke.

War es hilfreich?

Lösung

Der Compiler weiß nicht, dass die Environment.Exit () geht das Programm zu beenden; es sieht nur Sie auf eine Klasse eine statische Methode ausgeführt wird. Nur queue zu null initialisieren, wenn Sie es erklären.

Queue queue = null;

Andere Tipps

Der Compiler weiß nicht, dass Environment.Exit () nicht zurück. Warum nicht einfach "Rückkehr" von Main ()?

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

Just ersetzen Environment.Exit mit Rückkehr. Der Compiler weiß, dass das Ergebnis das Verfahren endet, aber nicht weiß, dass Environment.Exit den Fall ist.

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

Natürlich können Sie wirklich bekommen nur mit, dass weg, weil Sie 0 als Exit-Code in allen Fällen unter Verwendung sind. Wirklich, sollten Sie einen int anstelle von Environment.Exit zurückzukehren. Für diesen speziellen Fall würde dies meine bevorzugte Methode

sein
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, was wirklich Trick nur ein Compiler, der sagt: „Ich werde meine eigenen nicht initialisierten Variablen herauszufinden, vielen Dank“. Es ist ein nützlicher Trick, aber ich es in diesem Fall nicht mag - zu viele haben, wenn Zweige leicht zu überprüfen, ob Sie es richtig tun. Wenn Sie wirklich wollte es auf diese Art und Weise zu tun, so etwas wie das wäre deutlicher:

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());
}

Der Compiler weiß nur, dass der Code ist oder nicht erreichbar ist, wenn Sie „Rückkehr“ zu verwenden. Denken Sie an Environment.Exit () als eine Funktion, die Sie aufrufen, und der Compiler nicht wissen, dass es die Anwendung schließen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top