Почему 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();

Ссылка на раздел MSDN

Если вам нужен строчный вывод, просто нужно внести небольшие изменения:

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();
Другие вопросы по тегам