Console.ReadLine过早激活

时间:2017-01-05 19:09:36

标签: c#

我一直试图弄清楚这几次尝试,但我似乎无法理解为什么这条线会执行?

  

Console.WriteLine("请输入一个数字。");

我甚至在输入任何字符作为输入之前就在屏幕上显示它。 任何帮助表示赞赏

int numberAsInt;
while (true) {
    try {
        numberAsInt = Convert.ToInt32(Console.ReadLine());
        break;
    }
    catch {
        Console.WriteLine("please enter a number.");
    }
}

4 个答案:

答案 0 :(得分:3)

catch块被触发的原因是由以下原因引起的异常:

Convert.ToInt32(Console.ReadLine())

ReadLine()方法将读取您已输入的内容 - 即使没有任何内容。来自MSDN

  

[返回]输入流中的下一行字符,如果没有更多行可用,则返回null。

     

如果标准输入设备是键盘,则ReadLine方法将阻塞,直到用户按下Enter键。

答案 1 :(得分:1)

您不应该使用try / catch来检查您的输入。更好的方式:

int numberAsInt;
while (true) {
    String str = Console.ReadLine();
    if (int.TryParse(str, out numberAsInt)) {
        break;
    }
    Console.WriteLine("please enter a number.");
}

答案 2 :(得分:1)

无需使用无限while循环和try/catch块来验证用户是否输入了有效号码,您可以使用int.TryParse()代替。

int num;
string input = "";

while (!int.TryParse(input, out num))
{
    Console.Write("Enter a number:");
    input = Console.ReadLine();
}

Console.WriteLine("Number entered:" + num);

答案 3 :(得分:1)

要搭载Emerson Chen's answer,原因是因为Console.Readline将从控制台中提取信息...它在代码逻辑之外运行。

这意味着它不会等到您输入Console.Readline()才能获得输入。声音不应该发生在代码的同步位中吗?好吧,想一想:无论你是否告诉它,控制台都会继续工作。

这是一个可能出错的快速示例。您向控制台写了一条消息,告诉用户将手远离键盘:

Console.WriteLine("Please don't type anything for 2 seconds.");

好。现在用户不会弄乱任何东西,你可以做你的工作2秒,期望没有用户输入:

var startTime = DateTime.Now;

while (DateTime.Now < startTime.AddSeconds(2)) ;

好的,现在我们已准备好接受一些输入:

Console.WriteLine("Please enter a value.");
var inputVal = Console.ReadLine();

Console.WriteLine("The value entered was: " + inputVal);

效果很好。但是等一下,如果Johnny用户忽略了警告,并键入&#34; 100&#34;然后点击&#34;输入&#34;密钥在2秒之前过去了吗?在这种情况下,它全部由控制台记录,并在到达该行代码时尽职地传递给Console.ReadLine() ... 在用户输入后