Гид по технологиям

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

5 min read C++ Обновлено 05 Dec 2025
Преобразование типов в C# — Parse, TryParse, Convert
Преобразование типов в C# — Parse, TryParse, Convert

Код 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();

Если попытаться выполнить арифметическую операцию со строкой, компилятор/рантайм выдадут ошибку.

Ошибка компиляции: операция между строкой и double

Другой пример — попытка вызвать метод AddMinutes у строки приведёт к ошибке, потому что этот метод определён в DateTime:

Ошибка: недоступен метод AddMinutes для строки

Основные подходы к конвертации

Кратко о вариантах:

  • 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); // FormatException

Ошибка выполнения: неверная строка для парсинга в int

TryParse (рекомендуется для пользовательского ввода):

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.5

Double → 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‑метод)

  1. Проверить источник данных: доверенный/недоверенный.
  2. Выбрать TryParse для недоверенных источников.
  3. Для фиксированных форматов — ParseExact/TryParseExact с шаблоном.
  4. Проверить результат и логировать при ошибках.
  5. Показывать пользователю дружелюбное сообщение о неверном формате.

Глоссарий (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 зависит от источника данных и требований к обработке ошибок. Всегда учитывайте локаль при парсинге чисел и дат и не пренебрегайте проверками для пользовательского ввода.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как устроить идеальную вечеринку для просмотра ТВ
Развлечения

Как устроить идеальную вечеринку для просмотра ТВ

Как распаковать несколько RAR‑файлов сразу
Инструменты

Как распаковать несколько RAR‑файлов сразу

Приватный просмотр в Linux: как и зачем
Приватность

Приватный просмотр в Linux: как и зачем

Windows 11 не видит iPod — способы исправить
Руководство

Windows 11 не видит iPod — способы исправить

PS5: как настроить игровые пресеты
Консоли

PS5: как настроить игровые пресеты

Как переключить камеру в Omegle на iPhone и Android
Руководство

Как переключить камеру в Omegle на iPhone и Android