C# Console.ReadLine ReadKey等待输入两次后
C# Console.ReadLine after ReadKey waits for input two times
我不明白我在这里遗漏了什么,但似乎 Console.ReadKey()
仍然处于活动状态并且导致控制台让我在调用 [=12] 后使用 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);
}
我用这段代码进行了测试并得到了相同的行为:
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?。
至于控制台没有写出来就结束
"You've entered ..."
发生这种情况是因为程序在离开方法时终止并且控制台关闭。 运行 无需调试 (Ctrl + F5) 或在主程序末尾添加 Console.ReadLine() .
由于 Console.ReadKey() 的工作原理,控制台不会在第一次输入后等待。如果要等待用户按 Enter,请使用 ReadLine()。
至于Console.ReadLine()在存储输入之前等待两次,那是因为你正在使用
Console.TreatControlCAsInput = true;
这扰乱了控制台在内部接受输入的方式。摆脱它。
设置有问题:
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();
请参阅 MSDN 文章 Console.TreatControlCAsInput Property 在 Console.TreatControlCAsInput = true;
时读取输入
我不明白我在这里遗漏了什么,但似乎 Console.ReadKey()
仍然处于活动状态并且导致控制台让我在调用 [=12] 后使用 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);
}
我用这段代码进行了测试并得到了相同的行为:
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?。
至于控制台没有写出来就结束
"You've entered ..."
发生这种情况是因为程序在离开方法时终止并且控制台关闭。 运行 无需调试 (Ctrl + F5) 或在主程序末尾添加 Console.ReadLine() .
由于 Console.ReadKey() 的工作原理,控制台不会在第一次输入后等待。如果要等待用户按 Enter,请使用 ReadLine()。
至于Console.ReadLine()在存储输入之前等待两次,那是因为你正在使用
Console.TreatControlCAsInput = true;
这扰乱了控制台在内部接受输入的方式。摆脱它。
设置有问题:
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();
请参阅 MSDN 文章 Console.TreatControlCAsInput Property 在 Console.TreatControlCAsInput = true;
时读取输入