Ist mit einem 'goto' - Anweisung schlecht?

Nachdem ich einige reseach, wie zu brechen, die durch eine sekundäre Schleife

while (true) { //Main Loop
   for (int I = 0; I < 15; I++) { //Secondary loop
       //Do Something
       break; //Break main loop?
   }
}

meisten Menschen empfohlen, rufen Sie die 'gehe zu' - Funktion

Suchen, wie im folgenden Beispiel:

while (true) { //Main Loop
   for (int I = 0; I < 15; I++) { //Secondary Loop
       //Do Something
       goto ContinueOn; //Breaks the main loop
   }
}
ContinueOn:

Jedoch; ich habe oft gehört, dass die 'goto' - Anweisung ist eine schlechte Praxis. Das Bild unten ist perfekt illustriert meinen Punkt:
Ist mit einem 'goto' - Anweisung schlecht?

So

  • Wie schlimm ist die goto-Anweisung wirklich, und warum?
  • gibt es eine effektivere Art und Weise zu brechen, die die main-loop als mit der 'goto' - Anweisung?
  • Es ist nicht wirklich schlecht, seine nur, dass über 99% der Zeit, die andere loop-Konstrukte verwendet werden können, um zu schreiben, sauberer und klarer, in der Regel besseren code.
  • Ich nehme an, Sie meinte nur while(true) eher als do while(true)?
  • So etwas wie sein: loopVal=true while (loopVal){ for(){ if (){ loopVal=false; break; } } }
  • Is there a more effective way to break the main loop than using the 'goto' statement? Wie ist das nicht eine berechtigte Frage?
  • Das springen sieht sauberer aus, imo. Aber dann wieder, ich kann nicht machen, eine Antwort cos wird Es downvoted.
  • Candi, contThis macht das Gegenteil von break; Anstelle der Beendigung der Schleife sofort Schleifen wieder, überspringen Sie den rest des Codes.inue überspringt und weiter mit der Schleife meinst du Pause hier ist ein guter link, um zu erklären den Unterschied cplus.about.com/od/learningc/ss/clessonfive_3.htm
  • Das scheint mir ein durchaus vernünftiger Weg, um Büste aus einer tief verschachtelten Schleife. SPRINGEN bekommt seine "große satan" Ruf aus der Nutzung mit den Zeilennummern und den unnötigen Gebrauch in Fällen, wo etwas benötigt, um in eine Funktion. In JS haben wir beschriftet-Schleifen, die machen es einfach ausbrechen aus verschachtelten Schleifen auf jeder Ebene. Ich sehe nichts falsch mit diesem, obwohl, ich würde einen Kommentar hinzufügen Erläuterung, um zu vermeiden, reflexartige Hysterie von devs, die nicht wirklich verstehen, die Abneigung zu springen. Solange Sie die Einstellung nicht SPRINGEN, aber irgendwo am Ende einer Schleife oder einer äußeren Schleife gibt es kein Geruch IMO.
  • Wenn wir gehen, um die Debatte darüber, ob oder nicht SPRINGEN, ist immer noch eine schlechte Praxis, allgemein, dann ist dies ein Duplikat ist. Ansonsten halten die Diskussion lokale, um seinen code.
  • Wenn Sie schreiben, eine Antwort, goto ist vollkommen in Ordnung und Sie können einen Fall basierend auf der praktischen Nützlichkeit im konkreten Szenario, wie von der OP, Sie werden nicht get downvoted. Wenn Ihr einziger Grund ist, weil es sieht cleaner,..Sie könnten Recht haben.
  • Ich habe so getan, jetzt aber habe ich das Gefühl, es ist alles vergebliche Mühe. Im Wettbewerb gegen Jon Skeet und alle, in einer Sprache, die ich bin nicht vertraut mit.
  • Ich würde es nicht als Wettbewerb. Sie haben einen gültigen Punkt in Ihrem Beitrag, und John machte ein Gültiger Punkt in seinem post. Ich persönlich kann sich mit John ' s Ansatz, aber das hat nichts zu tun mit seinen Punkten, es ist mehr mit der Tatsache zu tun, dass ich früher gehe in VB6 (glücklich und richtig), aber in C# hatte nie die Notwendigkeit, due to return, break, Erträge, etc... das bedeutet nicht, Dass springen ist falsch. Ich finde auch, dass beim schreiben von testbarem code, den Sie schreiben Methoden, die eine konzentrierte Einheit von Arbeit, die Sie einfach unit-Tests. Nebenwirkungen von goto in manchen Fällen schwer zu unit-test.
  • ja, ich beziehe mich auf Fälle, in denen die gesamte nested-loop-Konstrukt ist eine Einheit, ich würde kein problem haben mit der Trennung wirklich trennen Sie Einheiten in Ihre eigenen Funktionen. Es würde keinen Sinn machen unit-Tests meine Inner Funktion ohne die übergeordnete Schleife zum Beispiel.
  • gehe in ein switch case ist eine große Hilfe beim Umgang mit Fällen, die wiederholt den gleichen code ein : haben Sie ein label in einem switch-case-Anweisung, dann setzen Sie springen, anstatt eine Pause in den Fällen, in Abschnitte, die einige gemeinsame Logik. Es klingt nicht so hässlich wie das, plus das label Geltungsbereich beschränkt sich auf die switch case.

Schreibe einen Kommentar