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

Преобразование типов и парсинг в 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
Автор
Редакция

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство