Преобразование типов и парсинг в C#

Когда вы объявляете переменную в C#, обычно присваиваете ей конкретный тип данных: integer, decimal, boolean, string и т.д. Часто требуется преобразовать значение из одного типа в другой — это называется конвертацией или парсингом.
Ниже собраны практические приёмы и рекомендации по основным сценариям: строки ↔ числа, строки ↔ double, double → int (кастинг), строки ↔ bool, строки ↔ DateTime. Кроме примеров кода — объяснение, когда использовать Parse, TryParse или Convert, обработка ошибок и краткая шпаргалка.
Зачем нужно конвертировать или парсить данные
Частые причины:
- Ввод от пользователя приходит как строка (Console.ReadLine()), но для расчётов нужен числовой тип.
- Некоторые методы доступны только для определённого типа (например, DateTime.AddMinutes).
- Соответствие структурам классов и API, которые ожидают конкретные типы.
Пример: ввод возраста в консоль — по умолчанию это строка, её нужно преобразовать в int, чтобы выполнить арифметику.
Console.WriteLine("Enter your age:");
string salary = Console.ReadLine();Если попытаться выполнить арифметическую операцию со строкой, компилятор/рантайм выдадут ошибку.
Другой пример — попытка вызвать метод AddMinutes у строки приведёт к ошибке, потому что этот метод определён в DateTime:
Основные подходы к конвертации
Кратко о вариантах:
- Parse() — бросает исключение при неправильном формате. Используйте, когда формат гарантирован.
- TryParse() — возвращает bool и не бросает исключение; безопасный выбор при ненадёжном вводе.
- Convert.* — универсальные методы превращения; иногда удобны, но могут скрывать приведение, которое вы не ожидаете.
- Явный каст (int)double — теряет дробную часть.
Строки → int
Parse:
string strInt = "45";
int int32 = Int32.Parse(strInt);
Console.WriteLine(int32); // output: 45Можно также парсить в Int16, Int64 и т.д.
Если строка не является числом, Parse бросит FormatException в рантайме:
string invalidString = "Hello";
int invalidResult = Int32.Parse(invalidString); // FormatExceptionTryParse (рекомендуется для пользовательского ввода):
int tryParseResult;
if (Int32.TryParse(invalidString, out tryParseResult))
{
Console.WriteLine(tryParseResult);
}
else
{
Console.WriteLine("Неверный формат числа");
}Обратное преобразование — ToString():
string intString = 45.ToString();
Console.WriteLine(intString); // output: 45Строки → double
Аналогично int, но учитывайте локаль (разделитель дробной части):
string strDouble = "90.5";
double d = Double.Parse(strDouble);
Console.WriteLine(d); // output: 90.5Если вход приходит в формате с запятой (“90,5”), используйте перегрузки Parse с CultureInfo или NumberStyles.
TryParse:
string invalidStringDouble = "Hello";
double tryParseDouble;
if (Double.TryParse(invalidStringDouble, out tryParseDouble))
{
Console.WriteLine(tryParseDouble);
}
else
{
Console.WriteLine("Неверный формат double");
}ToString обратно:
double dDouble = 90.5;
string dString = dDouble.ToString();
Console.WriteLine(dString); // output: 90.5Double → int (кастинг)
Явный каст приводит к отсечению дробной части:
double dValue = 12.34;
int iValue = (int)dValue;
Console.WriteLine(iValue); // output: 12Обратный каст:
dValue = (double)iValue;
Console.WriteLine(dValue); // output: 12Если вам нужно округление, используйте Math.Round/Math.Floor/Math.Ceiling.
Строки ↔ Boolean
Parse / Convert:
string stringBool = "True";
bool b = bool.Parse(stringBool);
// или
b = Convert.ToBoolean(stringBool);
Console.WriteLine(b); // output: TrueИ обратно:
string strTrue = true.ToString();
string strFalse = false.ToString();Интегральные значения ↔ Boolean
Convert.ToBoolean(int) преобразует 0 → false, 1 → true. Любое ненулевое значение по умолчанию даст true:
int falseBit = 0;
int trueBit = 1;
Console.WriteLine(Convert.ToBoolean(falseBit)); // output: False
Console.WriteLine(Convert.ToBoolean(trueBit)); // output: True
int other = 8;
Console.WriteLine(Convert.ToBoolean(other)); // output: TrueОбратное: Convert.ToInt32(bool) — true → 1, false → 0:
bool iBool = true;
int bInt = Convert.ToInt32(iBool);
Console.WriteLine(bInt); // output: 1Строки → DateTime
Простейший пример:
DateTime newDateTime = DateTime.Parse("01/01/2018 00:00:00");
Console.WriteLine(newDateTime); // output: 01/01/2018 00:00:00Также используйте DateTime.TryParse и DateTime.ParseExact/TryParseExact при фиксированных форматах.
Обратно:
DateTime dt = new DateTime(2018, 1, 1);
string dtString = dt.ToString();
Console.WriteLine(dtString); // output: 01/01/2018 00:00:00Когда выбирать Parse, TryParse или Convert — краткая инструкция
flowchart TD
A[Есть входные данные 'строка'?]
A --> B{Вы уверены в формате}
B -- Да --> C[Используйте Parse или Convert]
B -- Нет --> D[Используйте TryParse]
C --> E{Нужно ли ловить исключения?}
E -- Нет --> F[Parse 'короче код']
E -- Да --> G[Parse + try/catch]
D --> H[Обработка логики при false]Важно: Parse бросает исключение при неверном формате, TryParse — безопасен для повседневного пользовательского ввода.
Ошибки и обработка исключений — практические рекомендации
- Для пользовательского ввода всегда используйте TryParse.
- Если данные приходят из надёжного источника (внутренний формат, API с контрактом) — можно применять Parse и позволить исключению всплыть для отладки.
- Для локализованных чисел и дат указывайте CultureInfo, чтобы учитывался разделитель дробной части и формат даты.
- Не используйте исключения для обычного управления потоком — они дороже по производительности.
Сравнение методов (шпаргалка)
- Parse: прост, но бросает исключение при ошибке.
- TryParse: безопасно, возвращает bool, заполняет out-параметр.
- Convert: умеет преобразовывать между множеством типов, иногда выполняет неявные преобразования.
- Явный каст (int)double: быстро, но отбрасывает дробную часть.
Критерии приёмки
- Вход пользовательских данных отрабатывается без необработанных исключений.
- Для чисел и дат корректно учитывается культура (CultureInfo) при парсинге.
- В тестах покрыты случаи: корректный формат, пустая строка, неверный формат, граничные значения.
- Логика обработки ошибок даёт понятное сообщение пользователю.
Короткая методология работы с вводом (mini‑метод)
- Проверить источник данных: доверенный/недоверенный.
- Выбрать TryParse для недоверенных источников.
- Для фиксированных форматов — ParseExact/TryParseExact с шаблоном.
- Проверить результат и логировать при ошибках.
- Показывать пользователю дружелюбное сообщение о неверном формате.
Глоссарий (1‑строчные определения)
- Parse: метод, который преобразует строку в тип и бросает исключение при неверном формате.
- TryParse: безопасный метод парсинга, возвращает булево значение успеха.
- Convert: набор утилит для преобразования между типами.
- CultureInfo: информация о локали, влияющая на формат чисел и дат.
Часто встречающиеся ошибки и как их избежать
- Неправильная локаль: используйте CultureInfo.InvariantCulture или явно задавайте культуру.
- Ожидание округления при кастинге: используйте Math.Round если нужно округлить, а не отбросить дробную часть.
- Ожидание 0/1 при конвертации bool: учтите, что любое ненулевое число даст true.
FAQ
Нужно ли всегда использовать TryParse?
Для пользовательского ввода и внешних данных — да. Для внутренних гарантийных данных можно использовать Parse.
Как парсить даты в формате “dd.MM.yyyy”?
Используйте DateTime.ParseExact или TryParseExact с шаблоном “dd.MM.yyyy” и нужной культурой.
Как учесть разделитель дробной части и тысячные разделители?
Используйте перегрузки Parse/TryParse с NumberStyles и CultureInfo или CultureInfo.InvariantCulture для предсказуемого поведения.
Заключение
Преобразование типов — базовый навык при работе с C#. Выбор между Parse, TryParse и Convert зависит от источника данных и требований к обработке ошибок. Всегда учитывайте локаль при парсинге чисел и дат и не пренебрегайте проверками для пользовательского ввода.
Похожие материалы
Как устроить идеальную вечеринку для просмотра ТВ
Как распаковать несколько RAR‑файлов сразу
Приватный просмотр в Linux: как и зачем
Windows 11 не видит iPod — способы исправить
PS5: как настроить игровые пресеты