13

使用以下任一方法从对象中提取双精度体的优缺点是什么?除了个人偏好之外,我正在寻找反馈的问题还包括调试的便利性、性能、可维护性等。

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;
    }
}
4

4 回答 4

21
  • TryParse将比捕获异常更快
  • TryParse表示预期的事情 - 这里没有发生任何异常,只是您怀疑您的数据可能无效。
  • TryParse没有对正常控制流使用异常处理

基本上,一起去TryParse:)

顺便说一句,您的代码可以重写为:

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
于 2010-03-12T10:04:54.243 回答
4

TryParse 在性能方面比 TryCatch 更有效。

于 2010-03-12T10:04:29.590 回答
2

让 Parse 方法在输入错误时抛出异常是一个设计缺陷。当您从用户那里获取数据时,错误的输入是预期的行为。异常抛出是昂贵的,它不是你希望在你的代码中经常发生的事情。

值得庆幸的是,微软意识到了他们的错误并添加了 TryParse 方法。TryParse 不会产生错误输入时抛出异常的开销,但缺点是它必须返回两条数据,因此使用起来感觉有点尴尬。

现在,如果他们一开始没有创建损坏的 Parse 实现,那么 TryParse 只会被称为 Parse。

于 2010-03-12T10:19:39.867 回答
2

TryParse 更快,通常更好,但我建议在框架和后端编程中使用 TryCatch 方法,因为您可以向客户端提供有关错误的更多信息:

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}
于 2010-03-12T10:22:30.323 回答