goto-Anweisung in C#
Schreibe ich eine Funktion wie in C#:
public void CountNumber()
{
for(int i = 0; i < 40; i++) {
if(i > 20) {
goto out1;
}
Console.WriteLine("hello " + 1);
out1:
string hello = "";
}
}
Diesem Grunde zählt die Anzahl, und wenn das i ist größer als 20 sollte es nicht schreiben auf die Konsole.writeline. es sollte Schritt über, und drücken Sie "out1", aber die "out1" haben muss, um eine Funktion in der Ende zu kompilieren. Es muss "string hello = """ zu kompilieren. Ich brauche nicht das "string hello = """. Ich will ihn nichts tun und bekam am Ende der Schleife. Gibt es eine Möglichkeit, dies zu tun, ohne die "string hello=""", dass der out1: Anweisung muss? Wie:
public void CountNumber()
{
for(int i = 0; i < 40; i++) {
if(i > 20) {
goto out1;
}
Console.WriteLine("hello " + 1);
out1:
}
}
Dank.
invertieren der Logik und werfen Sie die goto
oder nicht kehrt die Logik und break anstelle von goto verwenden.
Warum nicht mit der for-Anweisung von 0 bis 20 ?
Zu einfach
oder nicht kehrt die Logik und break anstelle von goto verwenden.
Warum nicht mit der for-Anweisung von 0 bis 20 ?
Zu einfach
InformationsquelleAutor iefpw | 2011-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Schleife könnte leicht geschrieben, viele andere Möglichkeiten - man könnte nur Durchlaufen, solange
i<=20
statti<40
(am besten), oder bewegen Sie denConsole.WriteLine
Aufruf in der if-Anweisung mit der if-invertiert.Allerdings bin ich davon ausgegangen, dass Sie versuchen, zu arbeiten, mit einer aufwendigeren Szenario in Ihrem "realen" Fall. Wenn das der Fall ist, anstatt
goto
, verwenden Sie einfachcontinue
überspringen Sie den rest der Schleife:Können Sie ebenso
break
vollständig zu brechen aus der Schleife und nicht mehr Elemente, wenn das ist besser geeignet in Ihrer realen Fall.break
undcontinue
funktioniert nur auf die innerste Schleife. Für die Diskussion zu diesem Thema finden Sie unter Wie brechen Sie aus 2 loops ohne eine flag-variable in C#?InformationsquelleAutor Reed Copsey
Aber es ist absolut richtig, zu sagen, dass es bessere Möglichkeiten gibt, dieses problem zu lösen, als die Verwendung von goto, ich beachten Sie, dass, Nein, man hat tatsächlich Ihre Frage beantwortet.
Muss ein label-label eine Anweisung. Sie wollen einen Ort, der keine Anweisung zugeordnet. Sie können entweder eine leere Anweisung mit einem einzelnen Semikolon oder einen leeren block.
oder
Aber wie Sie sagen, gehen Sie nicht dort in Erster Linie, wenn Sie es vermeiden können.
out1: ;
)?Es gilt als schlechte form von vielen Menschen haben eine goto, goto-Funktion, um eine leere Anweisung ist schlimmer, und die goto-Funktion, um eine leere Anweisung, die legt zwei fast-identische Satzzeichen nebeneinander, ist noch schlimmer. Ich möchte vermeiden, dieses idiom, wenn möglich.
InformationsquelleAutor Eric Lippert
Nur umkehren, Ihren Zustand - auch
if...else
könnte eine alternative sein. Ich nehme an, es gibt andere code, sonst können Sie nur ändern, diefor
Schleife einfach zählen bis 20.InformationsquelleAutor BrokenGlass
Gibt es einige andere springen-wie die Aussagen, die Sie in Betracht ziehen sollten:
continue
geht in die nächste iteration der aktuellen Schleife.break
verlässt die aktuelle Schleifereturn
beendet die aktuelle MethodeSollten Sie nur
goto
wenn keine der oben genannten tut, was Sie wollen. Und in meiner Erfahrung ist das sehr selten der Fall.Es sieht aus wie Sie verwenden möchten
continue
hier.InformationsquelleAutor CodesInChaos
Können Sie die
continue
Stichwort:Jedoch, sollten Sie die
if
statt:InformationsquelleAutor Guffa
ja 🙂
Reed Copsey und Guffa Tat das gleiche 🙂
das merkwürdige ist, dass jeder tatsächlich die gleichen Fehler 🙂
korrigiert...
InformationsquelleAutor Tigran