Wie die goto-Anweisung funktioniert in diesem Beispiel?
Studiere ich dieses code-Beispiel:
class Program
{
static void Main(string[] args)
{
int x = 10;
int y = 10;
int generate=0;
string [,] myArrayTable = new string[x, y];
Console.WriteLine("Enter a seek number: ");
string cautat = Console.ReadLine();
for (int i = 0; i < x; i++)
{
for(int j = 0;j < y; j++)
{
myArrayTable[i, j] = (generate++).ToString();
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
if(cautat.Equals(myArrayTable[i,j]))
{
goto Found;
}
}
}
goto NotFound;
Found:
Console.WriteLine("Numarul a fost gasit");
NotFound:
Console.WriteLine("Numarul nu a fost gasit !");
Console.ReadKey();
}
}
Ich verstehe nicht, warum die "Nicht Gefunden" - Anweisung aufgerufen wurde und die zugehörige Meldung drucken auf der Konsole, wenn ich geben Sie einen versuchen Wert wie 10 verwendet werden, in diesem Fall " goto: Gefunden-Anweisung ausgeführt, so springen: NotFound-Anweisung wird nie aufgerufen werden, aber immer noch seine entsprechende Meldung wird ausgegeben auf der Konsole, ich verstehe nicht, wie da in diesem Fall das Programm nie springt, um dieses "NotFound" - label.
Bitte, wenn Sie jetzt geben Sie mir eine hand über diese...
Dank
- Gutes Beispiel
goto
Missbrauch - Sie wirklich umstrukturieren sollte, diese nicht zu benutzen, springen sowieso. Es ist nicht als gute Praxis in der Regel so erhalten Sie eine Menge von Kopf-schütteln auf code-review, und es neigt dazu, wartbaren. Um ehrlich zu sein es ist eine unverwechselbare wiff code-Geruch ausgeht, aus diesem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eww goto ' s, die ich benutzen würde und
if/else
- Anweisung, aber wenn Sie benötigen, springen:Würde ich diese umschreiben von code zu vermeiden, die Verwendung von goto:
Es wird genannt, weil Sie Ihren code innerhalb des label Gefunden hat, nichts zu erzwingen, es zu überspringen, den code int er NotFound label (es sei denn, Sie rufen Sie goto nochmals, die Ausführung wird fallen durch das label, anstatt es zu überspringen).
Dass gesagt wird, nicht verwenden
goto
! Ich werde so weit gehen zu sagen, dass es immer eine schlechte Idee und kann neu geschrieben werden.In Ihrem Fall, können Sie eine einfache boolean-flag, um loszuwerden, Ihre goto:
goto
eine sinnvolle option in diesem Fall. Wenn Sie nicht möchten, verwenden Sie Boolesche Werte zum beenden der Schleife gibt es immer Mark ' s Methode oder eine Alternative Lösung, dies in die Funktion und mache eine baldige Rückkehr.myArrayTable
könnten Sie werfen auch in der Prüfung.Weil Sie nur springen, um die Gefundenen label und gehen Sie zu fallen, über dem Etikett Nicht Gefunden. Brauchen Sie einen Dritten label namens EndFound und gehen, um es nach gefunden.
wenn Sie nicht wollen, dass die "Nicht Gefunden" - Statements ausgeführt werden, wenn das "Gefunden" - Statements ausführen, verwenden Sie einen anderen springen, überspringen Sie die NotFound Teil. goto jumpts einem Bereich, aber das bedeutet nicht, dass der Abschnitt nicht ausgeführt werden, wenn Sie nicht sprang, um über eine "goto". Denken Sie daran, den code ausführt, in einem top-down-Mode, so, wenn Sie irgendwie zu überspringen, ein Stück code ausgeführt wird.
Beispiel:
Weil, nachdem es springen zu
Found
Ausführung einfach immer die nächste Zeile,, die passiert werden die "nicht gefunden" console write line. Benötigen Sie noch eine andere springen, springen über, dass Sie (oder noch besser, Neugestaltung dies zu vermeiden, die gotos ganz)Es ist genau das problem, dass gotos sollte vermieden werden.