C# Console.WriteLine由于某种原因而重复自身
我是C#的绝对初学者,已经编写了这段代码,输出结果让我感到困惑: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
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这是一个字段。