C# (如果<或如果>)与Math.Sign

11

这可能是一个愚蠢的问题,但使用Math.Sign的原因是什么?

使用Math.Sign是否存在速度/优化方面的考虑,而不仅仅是使用if语句?也许只是最佳实践/代码可读性偏好吗?

if (rayDirX < 0) 
    stepX = -1; 
else 
    stepX = 1;

//----------

stepX = (rayDirX < 0) ? (-1) : (1);

//----------

stepX = Math.Sign(rayDirX);

2
我很高兴不是唯一一个认为这种方法几乎毫无意义的人... - Mike G
一个方法名比代数表达式更具描述性,封装常量以防止重复和出错的可能性。 - Dan Puzey
4个回答

5
我怀疑在功能上或性能上没有什么区别,但Math.Sign版本更加直观易懂,特别是在你的例子中rayDirX的类型未声明时。但这相当微妙,我不会因为使用任何一种而批评你。

编辑:

还有一件事,你上面的例子有一个小错误。在0的情况下,Math.Sign将返回0。以下是Math.Sign框架中反编译的代码:

public static int Sign(int value)
{
  if (value < 0)
  {
    return -1;
  }
  if (value > 0)
  {
    return 1;
  }
  return 0;
}

十年后的最新C#版本也与0.0进行比较,这使得它有点丑陋和慢。 - Trap

4

Math.Sign可以作为更大表达式的一部分。您也可以通过三元运算符获取符号以在表达式中使用,但并不是所有人都认为三元运算符可读性很高。


4

有一个功能上的区别:Math.Sign 有三个可能的返回值,并且如果输入为0,则返回零。使用(单个)三元运算符无法实现这一点。

来源

此外,方法名称比代数表达式更具描述性,封装常量以防止重复和错误的可能性。


1
你可以使用两个三元表达式来实现,如下所示:rayDirX < 0 ? -1 : rayDirX > 0 ? 1 : 0; - justin.m.chase

0

我认为这主要是可读性问题。我在参考资料中没有看到任何指向差异的内容。但正如Joel所说,Math.sign(rayDirX)更容易作为较大表达式的一部分使用,而不是if块或条件表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接