2016-12-16 4 views
1

ich ein absoluter Anfänger in C# bin und haben diesen Code geschrieben, und der Ausgang macht mich verwirrt:Console.WriteLine Wiederholt sich aus irgendeinem Grund

static void PlayerInfo() //Asking information about the player 
    { 
     Console.Write("Type your name: "); 
     string inputName = Console.ReadLine(); 

     if (inputName.Length < 2) 
      PlayerInfo(); 
     else 
      playerName = inputName; 

     Console.WriteLine("Hello " + playerName + "!"); 
    } 

Wenn ich J geben zuerst, es wird mich fragen wieder bis ich mindestens 2 Zeichen eintippe. Und wenn ich John Doe danach geben, wird es geben Sie mir diese Ausgabe zweimal Console.WriteLine("Hello " + playerName + "!");

Ich verstehe nicht, warum es so aussieht in der Konsole:

Type your name: J   //The length is smaller than 2 
Type your name: John Doe //Restart the function and type a valid length 
Hello John Doe!   //This is OK 
Hello John Doe!   //Why a second print? 

Es ist wahrscheinlich nicht die beste Praxis zu verwenden, eine rekursive Methode. Ich mache es nur, um die Sprache zu lernen.

+2

Es wird wegen der Rekursion zweimal gedruckt. Wenn du hindurchgehst, wirst du das sehen. –

+0

Jeder rekursive Aufruf muss enden; Wenn Ihre "innere" PlayerInfo den Code "backtracks" auf den vorherigen Aufruf beendet und macht, was als nächstes kommt; Wenn Sie J zweimal vor einer gültigen Eingabe eingeben; Die Nachricht wird 3 Mal angezeigt. Sie sollten versuchen, Schritt für Schritt (oder von Hand) zu debuggen, um zu verstehen, warum besser – Sehnsucht

+0

Schritt durch den Code mit einem Debugger. – Servy

Antwort

4

Das Problem tritt aufgrund der Rekursion auf.
Sie rufen PlayerInfo() zweimal, so dass Sie die Ausgabe zweimal erhalten, ist es so einfach.
Wenn Sie "A", dann "B", dann "John" eingegeben hätten, würden Sie die Ausgabe 3 Mal erhalten und so weiter.

Die Antwort ist, die Rekursion herauszunehmen. Wenn Sie aufgefordert behalten möchten, bis Sie eine gültige Eingabe dann eine Lösung erhalten, ist eine while Schleife:

void Main() 
{ 
    PlayerInfo(); 
} 

static void PlayerInfo() 
{ 
    string inputName = string.Empty; 

    // This will loop until inputName is longer than 2 characters 
    while (inputName.Length < 2) 
    { 
     Console.Write("Type your name: "); 
     inputName = Console.ReadLine(); 
    } 

    // Now that inputName is longer than 2 characters it prints the result only once 
    Console.WriteLine("Hello " + inputName + "!"); 
} 

Beispiel:

Ihr Name: Ein
Geben Sie Ihren Namen: B
Typ Ihr Name: John
Hallo John!

See it working on .NET Fiddle

2

Wie Sie gesagt haben, ist das Problem mit der Rekursion.

Ich gehe davon aus, dass playerName außerhalb dieser Methode deklariert wird.
Was passiert, ist, dass playerName bei Ihrem zweiten Anruf ordnungsgemäß zugewiesen wird.
Da sich die Variable auf Klassenebene befindet, wird der Wert beibehalten und auch auf dem äußersten Aufruf gedruckt.
Da dieser Anruf ging durch den if (inputName.Length < 2) Zweig Ihrer Bedingung, also nicht den Wert von playerName neu zuweisen.

Verwandte Themen