Ich habe mich gefragt, ob noch jemand die Schlüsselwortsyntax "goto" in C # verwendet und welche möglichen Gründe dafür vorliegen.
Ich neige dazu, Aussagen, die dazu führen, dass der Leser durch den Code springt, als schlechte Praxis anzusehen, habe mich aber gefragt, ob es glaubwürdige Szenarien für die Verwendung einer solchen Syntax gibt.
c#
.net
coding-style
goto
Brian Scott
quelle
quelle
goto
, um eine Schleife zu brechen und zur Startanweisung gemäß der spezifischen Bedingung zurückzukehrenAntworten:
Es gibt einige (seltene) Fälle, in denen goto die Lesbarkeit verbessern kann. In der Dokumentation, mit der Sie verlinkt haben, sind zwei Beispiele aufgeführt:
Hier ist ein Beispiel für letzteres:
Natürlich gibt es auch andere Möglichkeiten, um dieses Problem zu umgehen, z. B. das Umgestalten des Codes in eine Funktion, die Verwendung eines Dummy-Blocks usw. ( Einzelheiten finden Sie in dieser Frage ). Als Randnotiz beschlossen die Java-Sprachdesigner, goto vollständig zu verbieten und stattdessen eine beschriftete break- Anweisung einzuführen .
quelle
Ich erinnere mich an diesen Teil
Zu so etwas
Siehe dies
quelle
Ich verwende es in Eduasync ausgiebig , um die Art von Code zu zeigen, die der Compiler für Sie generiert, wenn Sie in C # 5 asynchrone Methoden verwenden. In Iteratorblöcken wird dasselbe angezeigt.
Im "normalen" Code kann ich mich jedoch nicht erinnern, wann ich ihn das letzte Mal verwendet habe ...
quelle
goto ist ideal, um aus vielen Schleifen auszubrechen, in denen break nicht gut funktionieren würde (z. B. unter Fehlerbedingungen), und wie Kragen sagte, wird goto vom Compiler verwendet, um switch-Anweisungen und einige andere Dinge zu generieren.
quelle
Ich erinnere mich nicht, jemals benutzt zu haben
goto
. Aber vielleicht verbessert es die Absicht einer Forever-Schleife, die Sie wirklich nie beenden möchten (neinbreak
, aber Sie können immer nochreturn
oderthrow
):Andererseits sollte ein einfaches
while (true)
ausreichen ...Sie können es auch in einer Situation verwenden, in der die erste Iteration einer Schleife in der Mitte der Schleife beginnen soll: Hier finden Sie ein Beispiel.
quelle
goto
.. undwhile(true) {..}
ist keine interessante Verwendung ..Der Compiler verwendet
goto
Anweisungen in verschiedenen Teilen des generierten Codes, beispielsweise in generierten Iteratorblocktypen (generiert bei Verwendung desyield return
Schlüsselworts - ich bin mir ziemlich sicher, dass die generierten XML-Serialisierungstypen auchgoto
irgendwo einige Anweisungen enthalten.Siehe Iteratorblock Implementierungsdetails: automatisch generierte Zustandsmaschinen für einige weitere Details, warum / wie die C # -Compiler Griffe dies.
Anders als generierter Code gibt es keinen guten Grund, eine
goto
Anweisung in normalem Code zu verwenden - dies erschwert das Verständnis des Codes und ist daher fehleranfälliger. Andererseits kann die Verwendung vongoto
Anweisungen in einem solchen generierten Code den Generierungsprozess vereinfachen und ist normalerweise in Ordnung, da niemand den generierten Code lesen (oder ändern) wird und keine Möglichkeit besteht, dass Fehler gemacht werden, weil eine Maschine schreibt.Siehe Go-to-Anweisung, die als schädlich für ein Argument gegen
goto
sowie ein klassisches Stück Programmiergeschichte angesehen wird.quelle
goto
nicht. Etwas zu beachten.Der Prozessor implementiert mindestens eine Sprunganweisung, und ich bin sicher, dass viele Anweisungen diese in ihrer Implementierung oder Interpretation verwenden.
Eines der guten Dinge bei der Verwendung einer Sprache der 3. oder 4. Generation ist, dass diese physischen Details von uns weg abstrahiert werden. Obwohl wir uns des Gesetzes der undichten Abstraktion bewusst sein sollten, denke ich, dass wir unsere Werkzeuge auch so verwenden sollten, wie sie beabsichtigt sind ( sorry ). Wenn ich Code schreiben würde und eine
goto
gute Idee wäre, wäre es Zeit für eine Umgestaltung. Der Zweck einer strukturierten Sprache besteht darin, diese "Sprünge" zu vermeiden und einen logischen Ablauf in unserem Engineering zu erzeugen.Ich sollte die Verwendung von vermeiden,
break
aber ich kann den Leistungsvorteil nicht übersehen. Wenn ich jedoch verschachtelte Schleifen habe, die sich gegenseitig benötigen, istbreak
es Zeit für eine Umgestaltung.Wenn jemand eine Verwendung vorschlagen kann,
goto
die besser erscheint als eine Umgestaltung, werde ich meine Antwort gerne zurückziehen.Ich hoffe, ich bin nicht schuldig, hier zum " Fahrradschuppen " zu eilen. Wie Kragen sagt, ist gut genug für Dijkstra gut genug für mich.
quelle
dynamic
Objekt und gehen Sie zu seinem Objektdiagramm, das mehrere Wörterbücher enthält, um zu den Werten zu gelangen, die ich benötige. Es ist nicht sinnvoll, Methoden zu verwenden, die einen Parameter haben unddynamic
dennoch eine genaue Objektform erwarten. Mit goto können Sie mehrere Ebenen aufbrechen und weiter durch eine Sammlung dieser Objekte gehen. [IchSpringen ist nie besser. Und fahren Sie fort, brechen Sie (außer in Schalter / Fall), (mehrfach) zurück und werfen Sie auch auf das kleinste Minimum. Sie möchten niemals aus der Mitte von Nestschleifen entkommen. Sie möchten immer, dass die Schleifensteuerungsanweisungen die gesamte Schleifensteuerung haben. Das Einrücken enthält Informationen, und alle diese Anweisungen werfen diese Informationen weg. Sie können auch alle Einrückungen entfernen.
quelle