Вопрос

Каковы плюсы и минусы использования любого из следующих подходов к извлечению двойника из объекта?Помимо личных предпочтений, вопросы, по которым я ищу отзывы, включают простоту отладки, производительность, ремонтопригодность и т. д.

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);
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top