Преобразование и парсинг типов данных в C#
TL;DR
Коротко: в C# значения можно конвертировать разными способами — Parse, TryParse, Convert и явное приведение (casting). Выбирайте TryParse для безопасного разбора входных данных, используйте Convert/ToString для простых преобразований и учитывайте культуру/формат (например, разделитель дробной части и формат даты).

Когда вы объявляете переменную в C#, обычно вы задаёте для неё конкретный тип: int, double, bool, string и т.д. Часто требуется преобразовать значение из одного типа в другой — например, превратить строку в число. Ниже — практическое руководство с примерами, лучшими практиками и проверками.
Зачем нужно преобразование и парсинг типов
В консольном приложении пользовательский ввод всегда приходит как строка:
Console.WriteLine("Введите ваш возраст:");
string age = Console.ReadLine();Если вы попытаетесь использовать age в математике, возникнет ошибка компиляции/выполнения, поскольку это string, а не int.
Важно: тип string хранит текст — даже если в нём цифры. Для арифметики нужно явно преобразовать.
Другой случай — методы, специфичные для типа. Например, у DateTime есть метод AddMinutes, у string его нет:
Иногда структура класса или контракт API требует строго заданных типов — тогда преобразование обязательно.
Основные способы преобразования
- Parse()/TryParse() — у типов (Int32.Parse, Double.TryParse и т.д.). Parse бросает исключение при ошибке; TryParse возвращает bool и не бросает.
- Convert.* — набор вспомогательных методов Convert.ToInt32, Convert.ToBoolean и т.д.; умеет работать с null (возвращает 0 или false) и некоторыми нестандартными входами.
- Явное приведение (casting) — для совместимых типов (например, double -> int). Отбрасывает дробную часть при приведении к int.
- ToString() — превращает значение в строку.
Примеры: парсинг общих типов
Строки в целые числа
string strInt = "45";
int int32 = Int32.Parse(strInt);
Console.WriteLine(int32); // output: 45Можно парсить в Int16, Int32, Int64 по нужной разрядности. Parse бросит FormatException, если строка не число:
string invalidString = "Hello";
int invalidResult = Int32.Parse(invalidString);Безопаснее использовать TryParse:
int tryParseResult = 0;
if (Int32.TryParse(invalidString, out tryParseResult))
{
Console.WriteLine(tryParseResult);
}
else
{
Console.WriteLine("Некорректное целое число");
}Обратно в строку:
string intString = 45.ToString();
Console.WriteLine(intString); // output: "45"Строки в double
Парсинг похож на целые, но обратите внимание на культуру (разделитель дробной части):
string strDouble = "90.5";
double d = Double.Parse(strDouble, System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(d); // output: 90.5Если в вашей локали используется запятая (“90,5”), используйте CultureInfo.CurrentCulture или Parse с явным NumberFormatInfo.
TryParse-пример:
string invalidStringDouble = "Hello";
double tryParseDouble;
if (Double.TryParse(invalidStringDouble, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out tryParseDouble))
{
Console.WriteLine(tryParseDouble);
}
else
{
Console.WriteLine("Некорректный формат double");
}Обратно в строку:
double dDouble = 90.5;
string dString = dDouble.ToString(System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(dString); // output: "90.5"Double в int (cast)
При явном приведении дробная часть отбросится:
double dValue = 12.34;
int iValue = (int)dValue;
Console.WriteLine(iValue); // output: 12Обратное приведение:
dValue = (double)iValue;
Console.WriteLine(dValue); // output: 12Строки и булевы значения
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();Целые числа и булевы значения
Convert.ToBoolean(0) -> false, Convert.ToBoolean(1) -> true. Любое не-нулевое число вернёт true.
int falseBit = 0;
int trueBit = 1;
Console.WriteLine(Convert.ToBoolean(falseBit)); // output: False
Console.WriteLine(Convert.ToBoolean(trueBit)); // output: True
int otherBit = 8;
Console.WriteLine(Convert.ToBoolean(otherBit)); // output: TrueОбратно:
bool iBool = true;
int bInt = Convert.ToInt32(iBool);
Console.WriteLine(bInt); // output: 1Строки в DateTime
Учтите формат даты и культуру при парсинге. В России привычный формат — dd.MM.yyyy, в США — MM/dd/yyyy.
DateTime newDateTime = DateTime.Parse("01.01.2018 00:00:00", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
Console.WriteLine(newDateTime); // output: 01.01.2018 00:00:00Или с ParseExact для строгого контроля формата:
var format = "dd.MM.yyyy HH:mm:ss";
DateTime dt = DateTime.ParseExact("01.01.2018 00:00:00", format, System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));Обратно в строку:
DateTime dt2 = new DateTime(2018, 1, 1);
string dtString = dt2.ToString("dd.MM.yyyy HH:mm:ss", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
Console.WriteLine(dtString); // output: 01.01.2018 00:00:00Когда парсинг может подвести
- Непредсказуемый формат входных данных (разные локали, разные разделители).
- Иногда Parse бросит исключение — используйте TryParse для внешних источников.
- Convert может не подходить при строгой валидации (он может привести null к 0).
Пример: строка “1,234” может означать 1.234 или 1234 в зависимости от культуры.
Примечание: всегда валидируйте входные данные и логируйте неудачные попытки парсинга.
Альтернативные подходы и эвристики
- Если данные приходят из API — договоритесь о контракте (JSON с типами), чтобы не парсить вручную.
- Для сложных правил преобразования используйте Map-слой или AutoMapper с кастомными конвертерами.
- Для ввода от пользователя всегда применять TryParse + сообщение об ошибке.
Ментальная модель: «Источник — Надежность — Контракт». Чем менее надежен источник, тем строже парсинг и валидация.
Роль‑ориентированные чеклисты
Для разработчика:
- Использовать TryParse для данных от пользователей.
- Указывать культуру при парсинге чисел/дат.
- Логировать ошибки парсинга.
Для QA:
- Тестировать разные локали (ru-RU, en-US).
- Проверять краевые значения и пустые строки.
- Проверять форматы дат с/без времени.
Для архитектора:
- Задокументировать контракт данных API.
- Предусмотреть версионирование форматов.
Критерии приёмки
- Входные строки корректно обрабатываются для целевых культур.
- Приложение не падает при неверных данных (используется TryParse или обработка исключений).
- Логируются причины неудачных преобразований.
Тестовые сценарии (минимум)
- Parse корректной строки “45” -> int 45.
- TryParse некорректной строки “abc” -> возвращает false, значение по умолчанию 0.
- Parse double со строкой “90.5” в InvariantCulture -> 90.5.
- ParseExact даты “01.01.2018 00:00:00” с форматом dd.MM.yyyy HH:mm:ss -> совпадение.
Безопасность и приватность
Парсинг сам по себе не создаёт уязвимости, но стоит контролировать исключения и логи: не выводите в лог конфиденциальные данные. Для данных, пришедших от внешних источников, применяйте валидацию и ограничения по длине.
Краткий словарь терминов
- Parse: метод, который преобразует строку в тип и может бросить исключение при ошибке.
- TryParse: безопасная версия, возвращает bool и использует out-параметр для результата.
- Convert: утилита .NET для преобразований с некоторыми упрощениями.
- Casting: явное приведение типов (обычно для совместимых типов).
Итог
Преобразование типов в C# — стандартная задача, но важно учитывать источник данных, локаль и требуемую степень безопасности. В большинстве случаев для пользовательского ввода выбирайте TryParse; для строгого соответствия формату используйте ParseExact; для простых преобразований — Convert и ToString.
Похожие материалы
Действие при закрытии крышки в Windows
Защита записи на SD и USB в Windows
Обновление ядра WSL вручную в Windows 11
Как закрыть аккаунт Amazon — шаги и риски
Исправить видео на YouTube без потери просмотров