Содержание
Несмотря на развитие приложений с графическим интерфейсом пользователя (GUI), работа в консоли всё равно занимает отнюдь не последнее место при разработке программ и не только в C#. В ряде случаев, работа с консолью просто необходима, например, при разработке приложений для работы с сетью. Более того, когда необходимо написать небольшой тестовый пример или программу для вычислений чего-либо, то намного проще сосредоточиться именно на основной функции программы — расчётах, чем тратить лишнее время на разработку графического интерфейса приложения.
Класс Console
Класс Console
в Windows предоставляет нам стандартные потоки ввода/вывода или, если говорить очень просто — окно со специальными свойствами. У этого класса есть набор специальных свойств, которые позволяют управлять этими потоками ввода/вывода, а также украшать, при необходимости, внешний вид консольного приложения, например, менять цвет фона, текста и т.д.
Консольный вывод (методы WriteLine, Write)
Для того, чтобы вывести какое-либо значение в консоль, у класса Console
объявлены методы Write
и WriteLine
, которые имеют различные версии, позволяющие без лишних преобразований выводить в консоль строки, числа, значения типа bool
и т.д. Ключевое отличие Write
от WriteLine
заключается в том, что WriteLine
записывает строку в консоль и устанавливает признак окончания строки, т.е. следующий за вызовом WriteLine
вывод в консоль будет происходить со следующей строки. Вызов Write
оставляет курсор на той же строке. Например,
Console.Write("Привет"); Console.Write(", "); Console.Write("мир");
Выведет в консоль текст в одну строку:
Следующий пример выведет в консоль несколько строк:
Console.WriteLine("Привет, мир"); Console.WriteLine(10); Console.WriteLine(true); Console.WriteLine(12.3);
Обратите внимание, что мы смогли вывести различные типы данных в консоль — строку, целое число, значение bool
и число с плавающей запятой.
10
True
12,3
Вывод нескольких значений
Нередко бывает необходимо вывести в консоль сразу несколько значений. В этом случае, мы можем воспользоваться двумя подходами. Первый — достаточно старый метод с использованием аргументов. Например:
string name = "Василий"; int age = 35; double height = 175.4; Console.WriteLine("Привет, {0}. Возраст {1}, рост {2} см", name, age, height);
здесь значения переменных вставляются в строку в соответствии с указанными в фигурных скобках порядковыми номерами (номера начинаются с нуля). В консоли мы увидим следующий вывод:
то есть, порядковому номеру 0 соответствует значение переменной name
, 1 — age
, 2 — height
.
Второй метод — использование интерполяции строк. Это более новый подход и, на мой взгляд, более интуитивно понятный. Например, выведем те же самые переменные, что и в предыдущем примере, используя интерполяцию:
Console.WriteLine($"Привет, {name}. Возраст {age}, рост {height} см");
Во-первых, перед строкой указан символ $
, что говорит нам о том, что строка интерполируется. Во-вторых, в фигурных скобках мы уже указываем не номера аргументов метода WriteLine
, а непосредственно сами переменные. Результат вывода в консоль будет точно такой же, но строка стала более понятной и читаемой. Возможности интерполяции строк более широкие, чем в представленном примере и об этой замечательной возможности мы ещё поговорим, когда будем рассматривать вопросы связанные с работой со строками.
Консольный ввод (методы Read, ReadLine и ReadKey)
Раз можно вывести значение в консоль, то можно значение и прочитать из консоли и присвоить его какой-либо переменной. Для чтения значений из консоли используются три метода — Read
, ReadLine
и ReadKey
.
Чтение следующей строки (ReadLine)
Console.Write("Введите своё имя: "); string? name; name = Console.ReadLine(); Console.WriteLine($"Привет, {name}");
Результат работы:
Привет, Вася
Отметим, что ReadLine
считывает именно строку, то есть, успешным результатом выполнения метода будет string
. Если же ReadLine
не может считать строку, то возвращается значение null
. В примере выше мы обозначили тип переменной name как string?
, что дословно означает следующее: переменная должна содержать значение типа string
, но также может содержать и null
. На возможность переменной хранить null
указывает знак вопроса после типа.
Чтение следующего символа (Read)
Этот метод применяется сравнительно реже, чем предыдущий, но, тем не менее, также может нам пригодиться. Метод Read
считывает следующий символ из строки и возвращает его значение в виде значения int32
. Если чтение символа не удалось, что метод возвращает значение -1
.
Чтение следующего нажатого символа или функциональной клавиши (ReadKey)
В отличие от методов Read и ReadLine метод ReadKey возвращает специальную структуру ConsoleKeyInfo
, содержащую информацию о нажатой клавише. Например, с помощью ReadKey можно отслеживать какие функциональные клавиши пользователь нажимает
ConsoleKeyInfo info = Console.ReadKey(); do { info = Console.ReadKey(); switch (info.Key) { case ConsoleKey.F1: { Console.WriteLine(" Не жми F1!"); break; } case ConsoleKey.Backspace: { Console.WriteLine(" Не жми Backspace!"); break; } } } while (info.Key != ConsoleKey.Enter);
здесь мы используем цикл do...while
и считываем очередную нажатую пользователем клавишу до тех пор, кока не будет нажата клавиша Enter
. При этом, если пользователь нажмет клавиши F1
или Backspace
, то программа выдаст предупреждение.
Также метод ReadKey
удобно вставлять в самом конце консольной программы для того, чтобы окно консоли не закрывалось автоматически после окончания работы программы.
Итого
Сегодня мы рассмотрели основные методы для работы с консолью в C# — ввод и вывод данных с использованием различных методов. Для вывода данных в консоль используются методы Write
и WriteLine
, в для ввода — Read
, ReadLine
и ReadKey
. На этом работа с консолью не заканчивается и в следующих частях мы рассмотрим то, как сделать консольный вывод в ваших приложениях бол