2016-12-16 12 views
1

何らかの理由で自分自身を繰り返し、出力は私が混乱して作っている:私は最初にJを入力するとConsole.WriteLineを私はC#での絶対的な初心者だと、このコードを書かれている

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 + "!"); 
    } 

、それは私に聞いてきます私は少なくとも2文字を入力するまで再び。私はその後ジョン・ドウを入力すると、それは私にこの出力を与える二回Console.WriteLine("Hello " + playerName + "!");

、それはコンソールで次のようになりますなぜ私は理解していない:

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? 

は、それはおそらく使用するのがベストプラクティスではありません再帰的な方法。私は言語を学ぶためにやっています。

+2

再帰のため2回印刷されています。あなたがそれを歩いていくと、あなたはそれを見るでしょう。 –

+0

各再帰呼び出しは終了する必要があります。あなたの "内側の" PlayerInfoがコードを終了させて​​、前の呼び出しに "バックトラック"し、次に何をするかを指定します。有効な入力の前にJを2回入力すると、メッセージは3回表示されます。理由を理解するために、ステップバイステップで(または手動で)デバッグしようとする必要があります – Sehnsucht

+0

デバッガでコードをステップ実行します。 – Servy

答えて

4

再帰が原因で問題が発生します。
PlayerInfo()を2回呼び出すと、出力が2回になるので、それは簡単です。
「A」、「B」、「John」と入力した場合、出力は3回続きます。

答えは再帰を取り除くことです。あなたは、有効な入力を受け取るまで、あなたが求める保持したい場合は一つの解決策はwhileループです:

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 + "!"); 
} 

例:

自分の名前を入力します。B
タイプ:
は、自分の名前を入力しますあなたの名前:ジョン
こんにちはジョン!

See it working on .NET Fiddle

2

あなたが言ったように、問題は再帰です。

私はplayerNameがこのメソッドの外で宣言されていると仮定しています。
2番目の呼び出しでplayerNameが正しく割り当てられています。
変数はクラスレベルにあるため、値は保存され、最も外側の呼び出しにも出力されます。
そのコールは、条件のif (inputName.Length < 2)ブランチを通過したので、playerNameの値を再割り当てしません。

関連する問題