Почему Console.ReadKey().Key.ToString получает строчные и прописные буквы одним нажатием?
Этот фрагмент выводит две буквы, когда я нажимаю одну клавишу (r).
string key = string.Empty;
key = Console.ReadKey().Key.ToString();
Console.WriteLine(key);
Console.ReadKey();
// Output: rR
Почему выводит нижний регистр 'r' и верхний регистр 'R', когда я нажимаю только один раз нижний регистр 'r'?
3 ответа
Строчные буквы r
это то, что вы написали с клавиатуры. Вы не удаляете это из консоли, читая это. И заглавная буква R
является символьным представлением Key
от ConsoleKeyInfo
состав. Если вы хотите прочитать именно то, что было написано в консоли, используйте Console.Read()
или же Console.ReadLine()
,
Console.ReadKey
возвращает ConsoleKeyInfo
объект, который выставляет собственность Key
который из ConsoleKey
тип. Где Key
представлен с enum
значение с заглавной буквы Увидеть ниже.
Теперь в вашем случае вы сначала читаете что r
с помощью Console.ReadKey()
и они вы выводите код, используя Console.WriteLine
который печатает значение ключа как R
,
Key
-property возвращает значение перечисления ConsoleKey
, Перечисление ConsoleKey
имеет эквивалент для каждой немодифицирующей клавиши (Alt, Shift & Ctrl; см. enum ConsoleModifiers
). Для этого есть 2 возможных признака, которые могут быть получены нажатием клавиши "R".
Другой пример, чтобы проиллюстрировать это, когда вы нажимаете 4
в вашей строке чисел над ключами. Это ConsoleKey
D4. Это может быть (см. key.KeyChar
) 4
или же $
, Также обратите внимание на собственность Modifiers
в ConsoleKeyInfo
-класс, показывающий нажатую модифицирующую клавишу.
Смотрите пример ниже, чтобы проиллюстрировать это:
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". Я использую C#6 с.Net 4.7. Возможно, вы используете более новую или более старую версию, где она выводит все возможные символы вместо самого значения enum на .ToString()
как это делает @ меня.
Старый вопрос, но подумал, что это может быть полезно добавить.
Как отметили другие, Console.ReadKey()
выполняет как чтение вашего введенного ключа, так и запись его на экран (перед Console.WriteLine()
вступает в силу).
Если вы просто хотите прочитать ввод, а не записать его, вы можете использовать необязательный аргумент bool intercept для 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();