Урок 3. Ввод и вывод, интерполяция строк
Почти каждая программа что-то получает и что-то выдаёт. В этом уроке — вывод на экран, вставка значений в текст и ввод с клавиатуры.
Вывод: Write и WriteLine
Console.WriteLine печатает и переводит строку, Console.Write — печатает и остаётся на той же строке. Пустой Console.WriteLine() выводит пустую строку.
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.
Интерполяция: $"…"
Чтобы вставить значения в текст (это и называется интерполяцией строк), перед строкой ставят $, а значения пишут в фигурных скобках. В скобках может быть любое выражение:
string name = "Анна";
int age = 16;
Console.WriteLine($"{name}, {age} лет");
Console.WriteLine($"Через год будет {age + 1}");
Console.WriteLine("Без знака $: {name}");
Console.WriteLine($"Фигурные скобки: {{ и }}");Анна, 16 лет
Через год будет 17
Без знака $: {name}
Фигурные скобки: { и }Без $ скобки печатаются как есть. Сами фигурные скобки в такой строке удваивают: {{ и }}.
После двоеточия в скобках можно задать формат, после запятой — ширину поля:
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 ]
Номер 007F2 — два знака после запятой (запятая — из русских настроек, см. урок Переменные и типы данных), ,4 — ширина 4 с выравниванием вправо, ,-4 — влево, D3 — целое не короче трёх цифр. Подробнее о форматах — в справке Как вывести число с двумя знаками после запятой.
В старом коде встречается другая запись того же: Console.WriteLine("{0} + {1} = {2}", 2, 3, 2 + 3); — номера в скобках заменяются значениями после запятой по порядку.
Ввод: Console.ReadLine
Console.ReadLine() ждёт, пока человек наберёт строку и нажмёт Enter, и возвращает набранное:
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):
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, — в справке Как перевести строку в число.
Несколько чисел в одной строке
Если числа вводят через пробел, строку сначала делят на части методом Split, а потом каждую часть переводят в число:
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 742Split(' ') делит строку по пробелам и возвращает массив строк — о массивах будет отдельный урок. StringSplitOptions.RemoveEmptyEntries выбрасывает пустые куски, которые получаются, если между числами несколько пробелов подряд. parts[0] — первая часть, parts[1] — вторая.
Частые ошибки
FormatExceptionпри вводе — набрано не число, лишний символ или пустая строка; для дробных — точка вместо запятой (или наоборот).Console.WriteвместоWriteLine— следующий вывод «прилипает» к той же строке.- Забыт
$перед строкой — на экран выводится{name}вместо значения. - В VS Code при запуске с отладкой ввод иногда не доходит до программы. Запустите её командой
dotnet runво встроенном терминале. - Русские буквы при вводе или выводе превращаются в знаки вопроса — справка Русские буквы в консоли.
Коротко
Console.WriteLine— с переводом строки,Console.Write— без.- Интерполяция:
$"Имя: {name}, через год {age + 1}"; формат — после двоеточия:{x:F2}. Console.ReadLine() ?? ""— строка с клавиатуры (или пустая, если ввода нет).- Ввод — всегда строка; число из неё делает
int.Parseилиdouble.Parse. - Несколько чисел в строке —
Split(' ', StringSplitOptions.RemoveEmptyEntries)иParseдля каждой части.