这可能是一个愚蠢的问题,但使用Math.Sign的原因是什么?
使用Math.Sign是否存在速度/优化方面的考虑,而不仅仅是使用if语句?也许只是最佳实践/代码可读性偏好吗?
if (rayDirX < 0)
stepX = -1;
else
stepX = 1;
//----------
stepX = (rayDirX < 0) ? (-1) : (1);
//----------
stepX = Math.Sign(rayDirX);
这可能是一个愚蠢的问题,但使用Math.Sign的原因是什么?
使用Math.Sign是否存在速度/优化方面的考虑,而不仅仅是使用if语句?也许只是最佳实践/代码可读性偏好吗?
if (rayDirX < 0)
stepX = -1;
else
stepX = 1;
//----------
stepX = (rayDirX < 0) ? (-1) : (1);
//----------
stepX = 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;
}
Math.Sign可以作为更大表达式的一部分。您也可以通过三元运算符获取符号以在表达式中使用,但并不是所有人都认为三元运算符可读性很高。
有一个功能上的区别:Math.Sign
有三个可能的返回值,并且如果输入为0,则返回零。使用(单个)三元运算符无法实现这一点。
(来源)
此外,方法名称比代数表达式更具描述性,封装常量以防止重复和错误的可能性。
rayDirX < 0 ? -1 : rayDirX > 0 ? 1 : 0;
- justin.m.chase我认为这主要是可读性问题。我在参考资料中没有看到任何指向差异的内容。但正如Joel所说,Math.sign(rayDirX)更容易作为较大表达式的一部分使用,而不是if块或条件表达式。