C# Console.WriteLine由于某种原因而重复自身

C# Console.WriteLine由于某种原因而重复自身,c#,recursion,console.writeline,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) PlayerIn

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

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

问题的出现是因为递归。
调用
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 + "!");
}
void Main()
{
PlayerInfo();
}
静态void PlayerInfo()
{
string inputName=string.Empty;
//这将循环直到inputName超过2个字符
while(inputName.Length<2)
{
控制台。写(“键入您的姓名:”;
inputName=Console.ReadLine();
}
//现在inputName超过2个字符,它只打印一次结果
Console.WriteLine(“Hello”+inputName+“!”);
}
例如:

键入您的姓名:A
键入您的姓名:B
键入您的姓名:John
你好,约翰


问题是由于递归而发生的。
调用
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 + "!");
}
void Main()
{
PlayerInfo();
}
静态void PlayerInfo()
{
string inputName=string.Empty;
//这将循环直到inputName超过2个字符
while(inputName.Length<2)
{
控制台。写(“键入您的姓名:”;
inputName=Console.ReadLine();
}
//现在inputName超过2个字符,它只打印一次结果
Console.WriteLine(“Hello”+inputName+“!”);
}
例如:

键入您的姓名:A
键入您的姓名:B
键入您的姓名:John
你好,约翰


正如您所说,问题在于递归

我假设
playerName
是在这个方法之外声明的。
发生的情况是,
playerName
在您的第二次通话中被正确分配。
由于变量处于类级别,因此该值也将保留并打印在最外层的调用上。

由于该调用通过了条件的
if(inputName.Length<2)
分支,因此没有像您所说的那样重新分配
playerName

的值,因此问题在于递归

我假设
playerName
是在这个方法之外声明的。
发生的情况是,
playerName
在您的第二次通话中被正确分配。
由于变量处于类级别,因此该值也将保留并打印在最外层的调用上。

由于该调用通过了条件的
if(inputName.Length<2)
分支,因此没有重新分配
playerName

的值,因此由于递归,它将打印两次。如果你仔细研究一下,你会发现,每个递归调用都需要结束;当您的“内部”PlayerInfo结束代码“回溯”到上一个调用并执行下一步操作时;如果在有效输入之前输入J两次;消息将显示3次。您应该尝试一步一步(或手动)调试,以了解为什么使用调试器可以更好地逐步调试代码。键入J时,您将再次重新输入代码。现在,键入两个字母可以让您退出PlayerInfo方法,但代码将从您在退出之前键入J并再次打印时离开的位置恢复。递归101。@ChrisZimmerman这是一个字段。由于递归,它打印了两次。如果你仔细研究一下,你会发现,每个递归调用都需要结束;当您的“内部”PlayerInfo结束代码“回溯”到上一个调用并执行下一步操作时;如果在有效输入之前输入J两次;消息将显示3次。您应该尝试一步一步(或手动)调试,以了解为什么使用调试器可以更好地逐步调试代码。键入J时,您将再次重新输入代码。现在,键入两个字母可以让您退出PlayerInfo方法,但代码将从您在退出之前键入J并再次打印时离开的位置恢复。递归101。@ChrisZimmerman这是一个字段。