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

Console.WriteLine repeating itself for some reason

我是 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?

使用递归方法可能不是最佳做法。我这样做只是为了学习语言。

问题是由于递归引起的。
你调用 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 + "!");
}

示例:

Type your name: A
Type your name: B
Type your name: John
Hello John!

See it working on .NET Fiddle

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

我假设 playerName 是在此方法之外声明的。
正在发生的事情是 playerName 在您的第二次呼叫中得到正确分配。
由于变量处于 class 级别,因此该值也会保留并打印在最外层的调用中。
由于该调用通过了您条件的 if (inputName.Length < 2) 分支,因此不会重新分配 playerName.

的值