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