【问题标题】:C# Console.ReadLine after ReadKey waits for input two timesC# Console.ReadLine 后 ReadKey 等待输入两次
【发布时间】:2017-02-20 19:41:47
【问题描述】:

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

一旦做出选择,我已经上下搜索了如何逃避ReadKey(),但无济于事。

为了澄清,这是出乎意料的行为: 当控制台弹出时,作为示例向用户呈现这三个选项。当用户随后键入“u”或“h”时,控制台不会等待;它会立即执行操作,而无需用户按 Enter

我做错了什么吗?

static void Main(string[] args)
{
    Console.WriteLine("u up");
    Console.WriteLine("h home");
    Console.WriteLine("x exit");
    Console.WriteLine("---------------------------------");
    Console.WriteLine("      [Enter Your Selection]");
    Console.WriteLine("---------------------------------");
    Console.Write("Enter Selection: ");
    ConsoleKeyInfo selection;
    Console.TreatControlCAsInput = true;
    int value;
    selection = Console.ReadKey();
    if (char.IsDigit(selection.KeyChar))
    {
        value = int.Parse(selection.KeyChar.ToString());
        value -= 1;
        Console.WriteLine("You've entered {0}", value);
    }
    else
    {
        switch (selection.Key)
        {
            case ConsoleKey.U:
                blurp();
                break;

            case ConsoleKey.H:
                blurp();
                break;

            case ConsoleKey.X:
                System.Environment.Exit(0);
                break;

            default:
                Console.WriteLine("Invalid Input...");
                break;
        }
    }
}

public static void blurp()
{
    Console.WriteLine("");
    Console.Write("Enter Another Value: ");
    string value = Console.ReadLine();
    Console.WriteLine("You've entered {0}", value);
}

【问题讨论】:

  • 我不明白这个问题。您暂停,直到按下一个键。如果是 U 或 H,您将暂停等待用户按 Enter。这与您的体验有何不同?
  • 请澄清你的问题,很难理解你在问什么。
  • 如果您运行代码,当用户选择 u、h 或 x 时,控制台不会等待,它会执行操作而无需按 Enter... 在此示例中,我放置u 和 h 情况下的“blurp”方法,然后提示用户输入另一个值。当用户输入值并按回车键时,控制台会强制您在退出之前输入 2x 并且永远不会写“您已输入 blah”
  • 经过测试,就像@JeremyWinslow saing -
  • @Muhammad 如果控制台不等待第一个输入的输入,那很好。我没有偏好。但真正的问题是,在“Blurp”中的第二个用户输入 ReadLine() 上。当用户输入内容并按下“enter”键时,后续的 writeline 不会写“你已经输入。 .blah”,并且用户必须输入两次回车键......我不明白我在这里做错了什么。

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


【解决方案1】:

我用这段代码进行了测试,得到了相同的行为:

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?

【讨论】:

  • 是的,确认,.. Console.TreatControlCAsInput = true;是问题所在。谢谢 Tatranksky Medved
【解决方案2】:

至于没有写出的控制台结束

 "You've entered ..."

这是因为程序在离开方法并且控制台关闭时终止。要么在不调试的情况下运行它 (Ctrl + F5),要么在 main 的末尾添加一个 Console.ReadLine()。

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

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

Console.TreatControlCAsInput = true;

这弄乱了控制台如何在内部接受输入。摆脱它。

【讨论】:

    【解决方案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读取输入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多