为什么 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
是您用键盘输入的内容。您不会通过阅读它从控制台中删除它。而大写字母R
是ConsoleKeyInfo
结构中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.KeyChar
)4
或 $
。另请注意 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();
如果您需要小写输出,只需稍作修改:
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();
当我按下一个键 (r) 时,此代码片段输出两个字母。
string key = string.Empty;
key = Console.ReadKey().Key.ToString();
Console.WriteLine(key);
Console.ReadKey();
// Output: rR
为什么我只按一次小写'r'却输出小写'r'和大写'R'?
小写的r
是您用键盘输入的内容。您不会通过阅读它从控制台中删除它。而大写字母R
是ConsoleKeyInfo
结构中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.KeyChar
)4
或 $
。另请注意 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();
如果您需要小写输出,只需稍作修改:
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();