Глиф Учебники

Урок 3. Ввод и вывод, интерполяция строк

Курс «C#» · урок 3 из 10 · 4 минуты чтения

Почти каждая программа что-то получает и что-то выдаёт. В этом уроке — вывод на экран, вставка значений в текст и ввод с клавиатуры.

Вывод: Write и WriteLine

Console.WriteLine печатает и переводит строку, Console.Write — печатает и остаётся на той же строке. Пустой Console.WriteLine() выводит пустую строку.

C#
Console.WriteLine("Первая строка");
Console.Write("Без перевода строки, ");
Console.Write("продолжение");
Console.WriteLine();
Console.WriteLine("Кавычки: \"C#\"");
Console.WriteLine("Две\nстроки");
Console.WriteLine(@"Путь: C:\Users\Anna");
Вывод
Первая строка
Без перевода строки, продолжение
Кавычки: "C#"
Две
строки
Путь: C:\Users\Anna

Внутри строки обратная косая черта \ начинает особый символ: \n — перевод строки, \t — табуляция, \" — кавычка, \\ — сама косая черта. Строка с @ перед кавычками («дословная») понимает \ буквально — так удобно записывать пути к файлам в Windows.

Интерполяция: $"…"

Чтобы вставить значения в текст (это и называется интерполяцией строк), перед строкой ставят $, а значения пишут в фигурных скобках. В скобках может быть любое выражение:

C#
string name = "Анна";
int age = 16;
Console.WriteLine($"{name}, {age} лет");
Console.WriteLine($"Через год будет {age + 1}");
Console.WriteLine("Без знака $: {name}");
Console.WriteLine($"Фигурные скобки: {{ и }}");
Вывод
Анна, 16 лет
Через год будет 17
Без знака $: {name}
Фигурные скобки: { и }

Без $ скобки печатаются как есть. Сами фигурные скобки в такой строке удваивают: {{ и }}.

name "Анна" age 16 $"{name}, {age} лет" Анна, 16 лет без $ "Без знака $: {name}" Без знака $: {name} скобки — как есть
Со знаком $ на место {name} и {age} подставляются значения переменных, а в строке без $ фигурные скобки остаются обычным текстом.

После двоеточия в скобках можно задать формат, после запятой — ширину поля:

C#
double price = 12.5;
int count = 3;
Console.WriteLine($"Итого: {price * count:F2}");
Console.WriteLine($"[{count,4}]");
Console.WriteLine($"[{count,-4}]");
Console.WriteLine($"Номер {7:D3}");
Вывод
Итого: 37,50
[   3]
[3   ]
Номер 007

F2 — два знака после запятой (запятая — из русских настроек, см. урок Переменные и типы данных), ,4 — ширина 4 с выравниванием вправо, ,-4 — влево, D3 — целое не короче трёх цифр. Подробнее о форматах — в справке Как вывести число с двумя знаками после запятой.

{ что вывести , ширина поля : формат } ширина, формат — по желанию $"Итого: {price * count:F2}" Итого: 37,50 2 знака после запятой $"[{count,4}]" [ 3 ] ширина 4, вправо $"[{count,-4}]" [ 3 ] ширина 4, влево $"Номер {7:D3}" Номер 007 не меньше 3 цифр
В фигурных скобках после значения через запятую задают ширину поля, а через двоеточие — формат вроде F2 или D3.

В старом коде встречается другая запись того же: Console.WriteLine("{0} + {1} = {2}", 2, 3, 2 + 3); — номера в скобках заменяются значениями после запятой по порядку.

Ввод: Console.ReadLine

Console.ReadLine() ждёт, пока человек наберёт строку и нажмёт Enter, и возвращает набранное:

C#
Console.Write("Как вас зовут? ");
string name = Console.ReadLine() ?? "";
Console.WriteLine($"Привет, {name}!");

На экране это выглядит так (имя набрано с клавиатуры):

Текст
Как вас зовут? Анна
Привет, Анна!

Зачем ?? "". Если ввод закончился (например, программе подали пустой файл), ReadLine возвращает null — особое значение «ничего нет». Поэтому её результат имеет тип string? — «строка или null». Запись a ?? b значит «a, а если оно null, то b»: в переменную попадёт набранная строка или, в крайнем случае, пустая. Без этого компилятор предупредит о возможном null (CS8600). Программа запустится и с предупреждением, но лучше привыкнуть писать чисто.

Числа с клавиатуры

ReadLine всегда возвращает строку: даже если набрать 5, программа получит текст "5". Число из строки делает int.Parse (для дробных — double.Parse):

C#
Console.Write("Первое число: ");
int a = int.Parse(Console.ReadLine() ?? "");
Console.Write("Второе число: ");
int b = int.Parse(Console.ReadLine() ?? "");
Console.WriteLine($"{a} + {b} = {a + b}");
Console.WriteLine($"{a} / {b} = {a / b}, остаток {a % b}");
Текст
Первое число: 17
Второе число: 5
17 + 5 = 22
17 / 5 = 3, остаток 2

Если набрать не число, int.Parse остановит программу с ошибкой FormatException. Как проверить ввод заранее (int.TryParse) и почему double.Parse с русскими настройками не принимает 2.5, а ждёт 2,5, — в справке Как перевести строку в число.

шаг и тип результата набрано 17 ввод закончился Console.ReadLine() string? "17" null ?? "" string "17" "" int.Parse(…) int 17 FormatException
ReadLine возвращает строку или null, запись ?? "" заменяет null пустой строкой, а int.Parse делает из строки число — из пустой строки получается ошибка FormatException.

Несколько чисел в одной строке

Если числа вводят через пробел, строку сначала делят на части методом Split, а потом каждую часть переводят в число:

C#
string line = Console.ReadLine() ?? "";
string[] parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
int x = int.Parse(parts[0]);
int y = int.Parse(parts[1]);
Console.WriteLine(x * y);
Ввод
6 7
Вывод
42

Split(' ') делит строку по пробелам и возвращает массив строк — о массивах будет отдельный урок. StringSplitOptions.RemoveEmptyEntries выбрасывает пустые куски, которые получаются, если между числами несколько пробелов подряд. parts[0] — первая часть, parts[1] — вторая.

Частые ошибки

Коротко

Проверьте себя

1. Что выведет Console.WriteLine("Возраст: {age}");, если age равно 16?
2. Какого типа значение возвращает Console.ReadLine()?
3. Что значит запись Console.ReadLine() ?? ""?
4. Что выведет Console.WriteLine($"{7:D3}");?