我是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?
使用递归方法可能不是最佳做法。我这样做只是为了学习语言。
答案 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
输入你的名字:约翰
你好约翰!
答案 1 :(得分:2)
正如你所说,问题在于递归。
我假设在此方法之外宣布playerName
发生的事情是playerName
在第二次通话时被正确分配
由于变量属于类级别,因此该值也会保留并打印在最外层的调用上
由于该调用通过了您的条件的if (inputName.Length < 2)
分支,因此无法重新分配playerName
的值。