Что такое метод Parse в C# и когда его использовать?

«Что такое метод Parse в C# и когда его использовать?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Parse — это статический метод, доступный у многих встроенных типов-значений (int, double, DateTime, bool и т.д.) и некоторых других типов (например, Enum). Его задача — преобразовать строковое представление в экземпляр целевого типа.

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

string numericString = "42";
int number = int.Parse(numericString); // number = 42

string dateString = "2023-12-25";
DateTime date = DateTime.Parse(dateString); // date = 25.12.2023 00:00:00

string boolString = "True";
bool flag = bool.Parse(boolString); // flag = true

Критически важный нюанс: Метод Parse кидает исключения при неудаче. Это его главное отличие от TryParse.

Ситуация (на примере int.Parse) Исключение
Строка null ArgumentNullException
Строка в неправильном формате ("abc") FormatException
Число выходит за диапазон типа ("9999999999" для int) OverflowException

Пример обработки ошибок:

public int SafeParseExample(string userInput)
{
    try
    {
        return int.Parse(userInput);
    }
    catch (FormatException)
    {
        Console.WriteLine($"Ошибка: '{userInput}' не является числом.");
        return 0; // Значение по умолчанию
    }
    catch (OverflowException)
    {
        Console.WriteLine($"Ошибка: число {userInput} вне диапазона int.");
        return 0;
    }
    // ArgumentNullException обычно не ловят здесь, а проверяют раньше.
}

Альтернатива — TryParse. Когда что использовать?

Критерий Parse TryParse
Поведение при ошибке Бросает исключение Возвращает bool, ошибка в out-параметре
Производительность Медленнее при частых ошибках (дорогие исключения) Быстрее, т.к. не использует исключения
Использование Когда строка гарантированно валидна (например, константа в коде, данные из доверенного источника) Когда данные приходят извне (пользовательский ввод, файл, сеть)

Правильный выбор — TryParse для ненадёжных данных:

// ПЛОХО: Если userInput может быть некорректным, это риск исключения.
// int age = int.Parse(txtAge.Text);

// ХОРОШО: Безопасный парсинг пользовательского ввода.
if (int.TryParse(txtAge.Text, out int age))
{
    // Успех, работаем с age
    Console.WriteLine($"Через год вам будет {age + 1}");
}
else
{
    // Обработка ошибки без try-catch
    Console.WriteLine("Пожалуйста, введите корректный возраст.");
}

// TryParse с разными типами и форматами
string salaryInput = "1,500.75";
if (double.TryParse(salaryInput, NumberStyles.Currency, CultureInfo.InvariantCulture, out double salary))
{
    // Учёт формата числа с разделителями и валюты
}

string today = "Monday";
if (Enum.TryParse<DayOfWeek>(today, out DayOfWeek day))
{
    // Успешный парсинг перечисления
}

Итог: Используйте Parse для жёстко закодированных или проверенных данных. Всегда используйте TryParse для данных, источник которых вы не контролируете полностью.