为什么 Console.ReadKey().Key.ToString 按一次会得到小写字母和大写字母?

Why does Console.ReadKey().Key.ToString get lower and uppercase Letter by pressing once?

当我按下一个键 (r) 时,此代码片段输出两个字母。

string key = string.Empty;
key = Console.ReadKey().Key.ToString();
Console.WriteLine(key);
Console.ReadKey();
// Output: rR

为什么我只按一次小写'r'却输出小写'r'和大写'R'?

小写的r是您用键盘输入的内容。您不会通过阅读它从控制台中删除它。而大写字母RConsoleKeyInfo结构中Key的字符表示。如果您想准确阅读写入控制台的内容,请使用 Console.Read()Console.ReadLine().

Console.ReadKey returns ConsoleKeyInfo 对象公开了 ConsoleKey 类型的 属性 Key。其中 Key 表示为 enum 值 大写字母。见下文。

现在在你的情况下,你首先阅读的是 r 使用 Console.ReadKey() 并且他们使用 Console.WriteLine 输出代码,它将键值打印为 R.

Key-属性returns枚举的一个值ConsoleKey。 枚举 ConsoleKey 对每个非修饰符键(Alt、Shift & Ctrl;参见枚举 ConsoleModifiers)都有一个等价物。 因此,按下“R”键可以产生两种可能的符号。

另一个说明这一点的例子是当您在按键上方的数字行中按 4 时。这是ConsoleKey D4。它可以是(参见 key.KeyChar4$。另请注意 ConsoleKeyInfo-class 中的 属性 Modifiers 显示按下的修改键。

请看下面的例子来说明:

var key = Console.ReadKey();//press 4
Console.WriteLine("ConsoleKey: " + key.Key); // D4
Console.WriteLine("Char: " + key.KeyChar); // 4
Console.WriteLine("ConsoleModifier: " + key.Modifiers); // 0
            
key = Console.ReadKey(); //press shift + 4
Console.WriteLine("ConsoleKey: " + key.Key); // D4
Console.WriteLine("Char: " + key.KeyChar); // $
Console.WriteLine("ConsoleModifier: " + key.Modifiers); // Shift

我从MSDN

那里获取了一些信息

顺便说一句:我只在按“R”或“r”时得到“R”。我在 .Net 4.7 中使用 C#6。也许您正在使用一些较新或较旧的版本,它输出所有可能的字符而不是 .ToString() 上的枚举值本身,就像@我一样。

老问题,但认为这可能对添加有用。

正如其他人所指出的,Console.ReadKey() 会读取您输入的密钥并将其写入屏幕(在您的 Console.WriteLine() 生效之前)。

如果你只是想读取输入而不是写入它,你可以使用Console.ReadKey()的可选布尔拦截参数来隐藏用户输入,然后再写入:

ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
Console.Write($"You pressed: {cki.Key}");

// press letter "a" (lower case)
// Output: You pressed: A
// i.e. no duplicated letter

Console.ReadLine();

Link to MSDN section

如果您需要小写输出,只需稍作修改:

ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
Console.Write($"You pressed: {cki.Key.ToString().ToLower()}");
// press letter "a" (lower case)    
// Output: You pressed: a

Console.ReadLine();