В чем разница в поведении методов `Parse` и `TryParse` при неудачной попытке преобразования строки в число в C#?

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

Ответ

Разница кардинальна: Parse использует исключения для обработки ошибок, а TryParseвозвращаемое значение, что делает его предпочтительным для обработки ненадежных данных.

Метод Parse (например, int.Parse, DateTime.Parse)

  • Механизм ошибки: Выбрасывает исключение, если строка имеет неверный формат.
  • Тип исключения: FormatException. Для числовых типов при переполнении — OverflowException.
  • Производительность: Низкая при ошибках. Создание и выбрасывание исключения — очень дорогая операция (тысячи тактов процессора).
  • Когда использовать: Когда вы абсолютно уверены в корректности и формате входных данных (например, разбор конфигурационного файла вашего приложения, констант).

Метод TryParse (например, int.TryParse, DateTime.TryParse)

  • Механизм ошибки: Возвращает bool (true — успех, false — неудача). Результат преобразования передается через параметр out.
  • Исключения: Не выбрасывает исключений при неудаче.
  • Производительность: Высокая. Даже в случае ошибки выполняется быстро, так как нет накладных расходов на исключения.
  • Когда использовать: Для обработки пользовательского ввода, данных из внешних источников (файлы, сеть, база данных), где возможны ошибки формата.

Наглядный пример:

string userInput = "123abc";

// ОПАСНО: Использование Parse для пользовательского ввода
try
{
    int parsedValue = int.Parse(userInput); // Выбросит FormatException
    Console.WriteLine($"Parsed: {parsedValue}");
}
catch (FormatException)
{
    Console.WriteLine("Parse failed with exception!"); // Дорогостоящая обработка
}

// ПРАВИЛЬНО: Использование TryParse для пользовательского ввода
if (int.TryParse(userInput, out int tryParsedValue))
{
    Console.WriteLine($"Parsed successfully: {tryParsedValue}");
}
else
{
    Console.WriteLine("Failed to parse. Using default value (0).");
    // tryParsedValue здесь равен default(int), т.е. 0.
    // Можно безопасно продолжить работу.
}

Best Practice: Всегда отдавайте предпочтение TryParse при работе с любыми внешними или непроверенными данными. Используйте Parse только в контролируемых внутренних сценариях, где ошибка формата свидетельствует о серьезной логической ошибке в коде.