Каковы за и против использования любого из следующих подходов к вытаскиванию двойного от объекта? Вне просто персональных предпочтений проблемы я ищу обратную связь на, включают простоту отладки, производительности, пригодность для обслуживания и т.д.
public static double GetDouble(object input, double defaultVal)
{
try
{
return Convert.ToDouble(input);
}
catch
{
return defaultVal;
}
}
public static double GetDouble(object input, double defaultVal)
{
double returnVal;
if (double.TryParse(input.ToString(), out returnVal))
{
return returnVal;
}
else
{
return defaultVal;
}
}
TryParse
будет быстрее, чем перехват исключенияTryParse
указывает на что-то ожидаемое - здесь не происходит ничего исключительного, просто вы подозреваете, что ваши данные могут быть недостоверными. TryParse
не использует обработку исключений для нормального потока управленияВ общем, выбирайте TryParse
:)
Кстати, ваш код можно переписать так:
public static double GetDouble(object input, double defaultVal)
{
double parsed;
return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
TryParse эффективнее TryCatch с точки зрения производительности.
То, что методы Parse выдают исключения при неверном вводе, было недостатком дизайна. Неверный ввод - это ожидаемое поведение, когда вы получаете данные от пользователя.Выбрасывание исключений - дело дорогое, вы не хотите, чтобы это происходило постоянно в вашем коде.
К счастью, Microsoft осознала свою ошибку и добавила методы TryParse. TryParse не вызывает накладные расходы, связанные с выдачей исключения при неверном вводе, но недостатком является то, что он должен возвращать два фрагмента данных, поэтому его использование немного неудобно.
Теперь, если бы они изначально не создали сломанную реализацию Parse, TryParse будет просто называться Parse.
TryParse быстрее и обычно лучше, но я бы предложил подход TryCatch в рамках фреймворка и внутреннего программирования, потому что вы можете предоставить клиенту больше информации об ошибке :
public double GetAge()
{
try
{
var input = _dataProvider.GetInput();
return Convert.ToDouble(input);
}
catch(Exception ex)
{
throw new MyBackendException(ex);
}
}