ReadKey等待输入两次后的C#Console.ReadLine

时间:2017-02-20 19:41:48

标签: c# console console.readline console.readkey

我不明白我在这里缺少什么,但似乎Console.ReadKey()仍处于活动状态,导致控制台在调用{{1}后使用Console.ReadLine()时让我输入两次}}

我在选择完成后上下搜索了如何逃避Console.ReadKey(),但无济于事。

澄清一下,这是出乎意料的行为: 当控制台弹出时,会向用户显示这三个选项作为示例。当用户输入" u"或" h",控制台不等待;它立即执行操作,而无需用户按 Enter

我是否在执行此操作时出错?

ReadKey()

3 个答案:

答案 0 :(得分:5)

我使用此代码测试并获得了相同的行为:

Console.Write("Enter Selection: ");
Console.TreatControlCAsInput = true;
ConsoleKeyInfo selection = Console.ReadKey();
if (selection.Key == ConsoleKey.U)
{
    Console.Write("Enter Another Value: ");
    string valueStr = Console.ReadLine();
    Console.WriteLine("You've entered {0}", valueStr);
}

解决方案是不使用Console.TreatControlCAsInput = true;,因为这会导致问题。

更多信息请参阅Stack Overflow问题 TreatControlCAsInput issue. Is this a bug?

答案 1 :(得分:3)

关于控制台结束而不写出

 "You've entered ..."
发生这种情况是因为程序在离开方法并且控制台关闭时终止。无需调试即可运行此命令( Ctrl + F5 )或在主体末尾添加Console.ReadLine()。

由于Console.ReadKey()的工作方式,控制台在第一次输入后不会等待。如果您要等待用户按 Enter ,请使用ReadLine()。

至于Console.ReadLine()在存储输入之前等待两次,那是因为你正在使用

Console.TreatControlCAsInput = true;

这与控制台内部如何接受输入有关。只是摆脱它。

答案 2 :(得分:3)

问题在于设置:

Console.TreatControlCAsInput = true;

如果你评论这一行,一切都按预期工作。这是C#中的已知功能。

如果您仍想设置Console.TreatControlCAsInput = true;您可以添加自定义方法来读取输入:

public static string CustomReadLine()
{
    ConsoleKeyInfo cki;
    string value = string.Empty;

    do
    {
        cki = Console.ReadKey();

        value = value + cki.Key;
    } while (cki.Key != ConsoleKey.Enter);

    return value;
}

更改您的代码

string value = Console.ReadLine();

使用此自定义功能

string value = CustomReadLine();

当您使用Console.TreatControlCAsInput = true时,请参阅MSDN文章 Console.TreatControlCAsInput Property 以阅读输入;