C#

Console.ReadLine в C#: как считать текст и число

Console.ReadLine() читает строку из консоли. Это главный способ сделать первую C#-программу интерактивной: спросить имя, возраст, цену, количество, команду меню

Самый простой пример:

Console.Write("Введите имя: ");
string? name = Console.ReadLine();
Console.WriteLine($"Привет, {name}!");

Важно: ReadLine всегда возвращает текст. Даже если пользователь ввел 25, для программы это сначала строка "25". Чтобы получить число, строку нужно преобразовать

Считываем строку

Начнем с имени:

Console.Write("Как вас зовут? ");
string? name = Console.ReadLine();

Console.WriteLine($"Привет, {name}!");

Console.Write выводит текст без перехода на новую строку. Пользователь вводит значение рядом с вопросом. Console.ReadLine() ждет Enter и возвращает введенную строку

Почему тип string?, а не просто string? В современном C# включена nullable-проверка. Теоретически ReadLine может вернуть null, например если поток ввода закрыт. В обычной учебной консоли вы почти всегда получите строку, но компилятор честно предупреждает о возможном null

Для первых уроков можно написать так:

string name = Console.ReadLine() ?? "";

Если вдруг пришел null, в переменную попадет пустая строка

Считываем число через int.Parse

Попросим возраст:

Console.Write("Введите возраст: ");
string? input = Console.ReadLine();
int age = int.Parse(input!);

Console.WriteLine($"Через год вам будет {age + 1}");

int.Parse преобразует строку в целое число. Восклицательный знак после input говорит компилятору: «я понимаю, что тут может быть null, но сейчас считаю значение не null»

Проблема в том, что программа упадет, если пользователь введет не число:

Введите возраст: двадцать

В этом случае будет FormatException

Безопасный ввод через TryParse

Для реальных учебных примеров лучше использовать TryParse:

Console.Write("Введите возраст: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
    Console.WriteLine($"Через год вам будет {age + 1}");
}
else
{
    Console.WriteLine("Возраст нужно вводить числом.");
}

TryParse не бросает исключение. Он возвращает true, если преобразование удалось, и false, если пользователь ввел неподходящий текст

out int age означает: если число получилось, положи его в переменную age

Ввод дробного числа

Для цены или веса нужен double или decimal

Console.Write("Введите цену: ");
string? input = Console.ReadLine();

if (decimal.TryParse(input, out decimal price))
{
    Console.WriteLine($"Цена: {price}");
}
else
{
    Console.WriteLine("Введите корректную цену.");
}

Для денег в C# чаще используют decimal, потому что он лучше подходит для финансовых расчетов. Для физики, графиков и обычных дробных учебных примеров часто используют double

Нюанс: в русской локали пользователь может вводить 10,5, а в англоязычной — 10.5. Если статья для новичков, лучше предупредить: формат дробного числа зависит от региональных настроек системы

Мини-проект: расчет заказа

Соберем небольшую программу: пользователь вводит название товара, количество и цену. Программа считает итог

Console.Write("Название товара: ");
string product = Console.ReadLine() ?? "Без названия";

Console.Write("Количество: ");
string? countInput = Console.ReadLine();

Console.Write("Цена: ");
string? priceInput = Console.ReadLine();

if (!int.TryParse(countInput, out int count))
{
    Console.WriteLine("Количество нужно ввести целым числом.");
    return;
}

if (!decimal.TryParse(priceInput, out decimal price))
{
    Console.WriteLine("Цена должна быть числом.");
    return;
}

decimal total = count * price;

Console.WriteLine();
Console.WriteLine("Заказ");
Console.WriteLine($"Товар: {product}");
Console.WriteLine($"Количество: {count}");
Console.WriteLine($"Цена: {price}");
Console.WriteLine($"Итого: {total}");

Здесь есть несколько важных приемов:

  • ?? задает значение по умолчанию;
  • TryParse проверяет ввод;
  • return завершает программу при ошибке;
  • итог считается только после успешной проверки.

Как повторять ввод, пока пользователь не введет число

Иногда лучше не завершать программу, а спросить еще раз:

int count;

while (true)
{
    Console.Write("Количество: ");
    string? input = Console.ReadLine();

    if (int.TryParse(input, out count) && count > 0)
    {
        break;
    }

    Console.WriteLine("Введите целое число больше нуля.");
}

Console.WriteLine($"Количество принято: {count}");

Такой цикл полезен для меню, калькуляторов и небольших консольных приложений

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

Пользователь ввел текст вместо числа. Используйте TryParse, а не Parse

Программа пропускает ввод. Обычно это встречается при смешивании разных способов чтения. В C# с ReadLine проблема появляется реже, чем в C++ с cin, но все равно проверяйте порядок команд

Компилятор ругается на null. Используйте string?, ?? "" или проверку:

if (string.IsNullOrWhiteSpace(name))
{
    Console.WriteLine("Имя не введено.");
}

Дробные числа не читаются. Проверьте, какую десятичную запись ждет ваша система: 10,5 или 10.5

Частые вопросы

Почему Console.ReadLine возвращает строку?

Потому что консольный ввод приходит как текст. Программа не знает заранее, число это, имя, команда меню или пустая строка

Что лучше: Parse или TryParse?

Для учебного примера можно показать Parse, но для нормального ввода лучше TryParse. Пользователь может ошибиться, и программа не должна падать

Зачем нужен знак ! после ReadLine?

Он отключает предупреждение о возможном null. Использовать его стоит аккуратно. Для новичка часто понятнее Console.ReadLine() ?? ""

Что открыть дальше

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x