C# Console.ReadLine过早激活

C# Console.ReadLine过早激活,c#,C#,我已经尝试了几十次,试图弄明白这一点,但我似乎不明白为什么这一行会执行 Console.WriteLine(“请输入一个数字”) 我甚至在输入任何字符之前就在屏幕上看到了它。 谢谢你的帮助 int numberAsInt; while (true) { try { numberAsInt = Convert.ToInt32(Console.ReadLine()); break; } catch { Console.Write

我已经尝试了几十次,试图弄明白这一点,但我似乎不明白为什么这一行会执行

Console.WriteLine(“请输入一个数字”)

我甚至在输入任何字符之前就在屏幕上看到了它。 谢谢你的帮助

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

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

Convert.ToInt32(Console.ReadLine())
ReadLine()
方法将读取您已经输入的任何内容,即使没有输入。发件人:

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

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


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

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

无需无限
while
循环和
try/catch
块来验证用户输入的数字是否有效,您可以改用

要继续,原因是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)) ;

效果很好。但是,等等,如果Johnny User忽略了警告,并键入“100”,然后在2秒之前点击“回车”键,该怎么办?在这种情况下,所有这些都由控制台记录,并在到达该行代码时尽职尽责地传递到
Console.ReadLine()
在用户输入后。

请提供(您有点)和再现问题所需的数据-显然您正在读取您不期望的值-调试应显示它(通常您先读取变量,以便更容易看到确切值…)我不同意否决票。这个问题已经解决了所有需要解决的问题-我也很困惑,为什么,在我的机器上工作得很好…启动程序后你有没有按任何键?正如其他人所说,调试成这个问题。添加
字符串enteredValue=Console.ReadLine()在转换之前,调试以查看您输入的是否真的是一个数字,然后尝试转换。如果提供的值确实是一个数字,则代码工作正常。请使用catch子句打印异常消息,然后发布异常消息。还请将控制台的输入捕获到字符串变量中,并使用调试器找出此变量能够在我的计算机上复制的值,并验证此答案。做得好。
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);