JavaScript unterstützt eine gotoähnliche Syntax zum Aufbrechen von verschachtelten Schleifen. Es ist im Allgemeinen keine großartige Idee, aber es wird als akzeptable Praxis angesehen. C # unterstützt nicht direkt die break labelName
Syntax ... aber es unterstützt die berüchtigte goto
.
Ich glaube, dass das Äquivalent in C # erreicht werden kann:
%Vor% Nach der gleichen Logik von JavaScript ist das Szenario mit verschachtelten Schleifen eine akzeptable Verwendung von goto
? Ansonsten ist die einzige Möglichkeit, die ich kenne, um diese Funktionalität zu erreichen, darin zu bestehen, ein bool
mit einem geeigneten Bereich zu setzen.
Meine Meinung: Komplexe Code-Flows mit verschachtelten Schleifen sind schwer zu verstehen; Verzweigen, ob es mit Goto oder Pause ist, macht es nur schwieriger. Anstatt den goto zu schreiben, würde ich zuerst ernsthaft darüber nachdenken, ob es einen Weg gibt, die verschachtelten Schleifen zu eliminieren.
Ein paar nützliche Techniken:
Erste Technik: Refactor die innere Schleife zu einer Methode. Lassen Sie die Methode zurückgeben, ob Sie aus der äußeren Schleife ausbrechen oder nicht. Also:
%Vor%wird
%Vor%Zweite Technik: Wenn die Schleifen keine Nebenwirkungen haben, verwenden Sie LINQ.
%Vor%stattdessen, schreiben Sie:
%Vor%Keine Schleifen, daher ist kein Ausbrechen erforderlich.
Alternativ können Sie, wie der Konfigurator in einem Kommentar angibt, den Code in folgender Form schreiben:
%Vor%Die Moral der Geschichte: Schleifen betonen den Kontrollfluss auf Kosten der Geschäftslogik . Statt zu versuchen, mehr und mehr komplexe Steuerungsabläufe übereinander zu stapeln, versuchen Sie, den Code zu refaktorieren, damit die Geschäftslogik klar ist.
Ich persönlich würde versuchen zu vermeiden, goto hier zu verwenden, indem Sie einfach die Schleife in eine andere Methode setzen - während Sie nicht leicht aus einer bestimmten Ebene der Schleife ausbrechen können, können Sie leicht Rückkehr von einer Methode jederzeit.
Nach meiner Erfahrung hat dieser Ansatz im Allgemeinen zu einem einfacheren und besser lesbaren Code mit kürzeren Methoden geführt (im Allgemeinen bei einer bestimmten Aufgabe).
Lassen Sie uns eines klarstellen: Es gibt nichts grundsätzlich Falsches an der goto
-Anweisung, es ist nicht böse - es ist nur ein weiteres Werkzeug in der Toolbox. Es ist wie Sie es verwenden , das wirklich wichtig ist, und es wird leicht missbraucht.
Das Ausbrechen einer verschachtelten Schleife einer Beschreibung kann eine gültige Verwendung der Anweisung sein, obwohl Sie zuerst nachsehen sollten, ob sie neu entworfen werden kann. Können die Exits für den Loop-Exit neu geschrieben werden? Verwenden Sie die geeignete Art von Schleife? Können Sie die Liste der Daten filtern, die Sie durchlaufen, so dass Sie nicht vorzeitig beenden müssen? Sollten Sie einen Schleifencode in eine separate Funktion umwandeln?
IMO ist akzeptabel in Sprachen, die break n;
nicht unterstützen, wobei n
die Anzahl der Schleifen angibt, die es ausbrechen soll.
Zumindest ist es viel lesbarer als das Setzen einer Variablen, die dann in der äußeren Schleife überprüft wird.
In C # ist das ein wenig inakzeptabel. Wenn dein Design es nicht vermeiden kann, dann musst du es benutzen. Aber erschöpfen Sie alle anderen Alternativen zuerst. Es wird für bessere Lesbarkeit und Wartbarkeit sorgen. Für Ihr Beispiel habe ich ein solches potenzielles Refactoring erstellt:
%Vor%In C # nicht akzeptabel.
Wickeln Sie die Schleife einfach in eine Funktion und verwenden Sie return
.
BEARBEITEN: Bei SO wird das Abwählen für falsche Antworten verwendet und nicht für Antworten, mit denen Sie nicht einverstanden sind. Da das OP ausdrücklich gefragt hat, "ist es akzeptabel?", Ist die Antwort "inakzeptabel" nicht inkorrekt (obwohl Sie dem widersprechen könnten).
Ich empfehle, continue
zu verwenden, wenn Sie dieses eine Element überspringen möchten, und break
, wenn Sie die Schleife beenden möchten. Für tiefer verschachtelt setzen Sie es in eine Methode und verwenden return
. Ich persönlich würde lieber einen Status bool als ein goto
verwenden. Verwenden Sie stattdessen goto
als letztes Mittel.
Tags und Links javascript c#