Ответ
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 для данных, источник которых вы не контролируете полностью.