【问题标题】:What's the most regular value for returning?返回的最常规价值是多少?
【发布时间】:2014-07-15 00:07:49
【问题描述】:

我只是想问你:我有一种方法可以用 3 个参数计算三角形面积 - 三角形的边。该方法的返回类型是 double。因此,如果每两条边的总和低于第三条边,我必须返回一个值。在错误情况下返回的最常规值是多少?我现在建议double.NaN 是最好的做法。

public static double CalculateTriangleArea(double firstSide, double secondSide, double thirdSide)
{
   bool areSidesPositive = (firstSide <= 0) || (secondSide <= 0) || (thirdSide <= 0);
   if (areSidesPositive)
   {
      double halfPerimeter = (firstSide + secondSide + thirdSide) / 2;
      double area = Math.Sqrt(halfPerimeter * (halfPerimeter - firstSide) * (halfPerimeter - secondSide) * (halfPerimeter - thirdSide));

      return area;
   }

   return double.NaN;
 }

【问题讨论】:

  • 如果这些参数无效,您可以抛出 ArgumentException
  • +1 到参数异常。如果您的方法无法执行,则不应返回值,这就是 ArgumentException 的用途!
  • @TimSchmelter 我不同意参数异常,因为它增加了额外的开销,他可以使用带有布尔返回值的尝试
  • @K.B:取决于参数的无效程度以及这种情况发生的频率。你可以创建一个TryCalculateTriangleArea,以bool 作为返回值,以double 作为out 参数,所以TryParse-模式。
  • 我知道这是正确的方法,但我没有提到你可以抛出异常而不返回任何值。现在我只是用 ArgumentException 替换了 return double.NaN 而没有收到编译错误。非常感谢。

标签: c# double area


【解决方案1】:

你可以使用:

    return default(double);

【讨论】:

  • 我在想当面积不是正数时,OP 应该考虑0。对于无效参数返回默认值的情况是不合适的。您提出的抛出ArgumentException 的建议更合适。谢谢。
【解决方案2】:

您可以像这样使用双精度值返回:

return default(double);

也正如 Tim 所建议的,如果 ArgumentException 是无效参数,最好抛出它。

public static double CalculateTriangleArea(double firstSide, double secondSide, double thirdSide)
{
   bool areSidesPositive = (firstSide <= 0) || (secondSide <= 0) || (thirdSide <= 0);
   if (areSidesPositive)
   {
      double halfPerimeter = (firstSide + secondSide + thirdSide) / 2;
      double area = Math.Sqrt(halfPerimeter * (halfPerimeter - firstSide) * (halfPerimeter - secondSide) * (halfPerimeter - thirdSide));

      return area;
   }

   throw new ArgumentException("Argument not correct",
                                    firstSide,secondSide, thirdSide);
 }

【讨论】:

  • 这将返回0,如果形状不是三角形,则返回不正确。
【解决方案3】:

一个建议的答案可能是

public static bool TryCalculateTriangleArea(double firstSide, double secondSide, double thirdSide,out double rArea)
    {
        bool areSidesPositive = (firstSide <= 0) || (secondSide <= 0) || (thirdSide <= 0);
        if (areSidesPositive)
        {
            double halfPerimeter = (firstSide + secondSide + thirdSide) / 2;
            double area = Math.Sqrt(halfPerimeter * (halfPerimeter - firstSide) * (halfPerimeter - secondSide) * (halfPerimeter - thirdSide));

            rArea= area;
  return  true ;  
        }

        return  false  
    }

【讨论】:

  • 我无法更改返回类型。
  • @StanimirYakimov:你知道你仍然得到在out参数中计算的double值吗?
  • @StanimirYakimov “我无法更改返回类型”。是什么原因?
  • 哦,是的,我刚刚看到了。我必须向右滚动。
  • 因为它是重构练习并且它在需求中指定。
【解决方案4】:

通过传递比其他两个组合更长的一侧,您违反了函数的(隐式)先决条件,因此我建议抛出ArgumentException 而不是返回值。

【讨论】:

    【解决方案5】:

    您的代码错误,您应该使用if (!areSidesPositive) 而不是if (areSidesPositive) ...即使使用良好的参数,您的代码也永远不会执行。 是的,抛出 ArgumentException 这是最好的方法。

    【讨论】:

    • 是的,但现在他的逻辑是错误的。 areSidesPositive 返回错误的结果。
    • 是的,我同意。如果他想保留他的代码,布尔名称应该是areSidesNegative
    【解决方案6】:

    在您的具体情况下,无需做任何事情:

    public static double CalculateTriangleArea(double firstSide, double secondSide, double thirdSide)
    {
        double halfPerimeter = (firstSide + secondSide + thirdSide) / 2;
        return Math.Sqrt(halfPerimeter * (halfPerimeter - firstSide) * (halfPerimeter - secondSide) * (halfPerimeter - thirdSide));
    }
    

    如果参数错误,Point is Math.Sqrt 将返回 NaN/+Infinity(这是无异常方法)。使用前必须检查返回值(如果是NaN+Infinity)。

    其他可能的方法是抛出异常(ArugmentException?ArgumentOutOfRangeException?YourOwnException?whatever)以在参数错误的情况下明确中断程序流程。尽管有开销,但在具有多个相互关联的操作的情况下,它可能是一种首选方式。 If 更快,但如果您并不真正关心到底出了什么问题,只是想中断流程,则泛化错误(显示 "Something is wrong" 消息)可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多