由于某种原因,Console.WriteLine重复自己

时间:2016-12-16 17:14:45

标签: c# recursion 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 + "!");
    }

如果我先输入J,它会再次问我,直到我输入至少2个字符。如果我之后输入John Doe,它会给我两次输出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 个答案:

答案 0 :(得分:4)

由于递归而出现问题 你打电话给PlayerInfo()两次,这样你就可以得到两次输出,就这么简单 如果您输入“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 + "!");
}

示例:

  

输入您的姓名:A
  输入你的姓名:B
  输入你的名字:约翰
  你好约翰!

See it working on .NET Fiddle

答案 1 :(得分:2)

正如你所说,问题在于递归。

我假设在此方法之外宣布playerName 发生的事情是playerName在第二次通话时被正确分配 由于变量属于类级别,因此该值也会保留并打印在最外层的调用上 由于该调用通过了您的条件的if (inputName.Length < 2)分支,因此无法重新分配playerName的值。