if、else if和多次返回

本文关键字:if 返回 else | 更新日期: 2023-09-27 18:00:37

这不是关于连锁的ifsifselse-ifs的问题。我已经在SO中看到了很多这样的问题。

我的问题也不是性能,而是编码标准可读性

考虑一下我在一个项目中经常看到的以下琐碎的伪代码:

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}

我通常用一种稍微不同的方式来写这种结构:

if (expression > 0)
{
    return 1;
}
if (expression < 0)
{
    return -1;
}
return 0;

当然,还有第三种选择,它遵循的规则是,任何方法都不应该有一个以上的返回语句,当方法的复杂性较低时,我觉得这太过限制和繁琐:

int retVal;
if (expression > 0)
{
    retVal = 1;
}
else if (expression < 0)
{
    retVal = -1;
}
else
{
    retVal = 0;
}
return retVal;

在编写这些类型的构造时,上面列出的选项之一是否更正确?就性能而言,我知道这个选择完全无关,但从可读性的角度来看,我有点喜欢避免使用if-else-if-语句。也就是说,许多同事不同意我的观点,尽管他们不能给我任何有说服力的论据。

if、else if和多次返回

有很多方法。你可以采取你展示的两种方法中的一种。你可以做:

if (expression == 0)
{
    return 0;
}
return expression < 0 ? -1 : 1;

或者完全使用三元运算符:

return expression == 0
    ? 0
    : expression < 0 ? -1 : 1;

还有一种选择是使用函数方法,比如我自己的SuccincT库提供的方法:

return expression.Match().To<int>()
                 .Where(e => e < 0).Do(-1)
                 .Where(e => e > 0).Do(1)
                 .Else(0).Result();

这都是一个偏好的问题,真的没有一个正确的答案。

考虑

return expression < 0? -1:
       expression > 0? +1:
       0;

一般来说,它在很大程度上取决于偏好和语义。

如果所有三种情况(>0<0==0)都是对称的,那么你的第一种选择对我来说很好

如果默认路径应该返回0,并且>0<0的情况是特殊/异常的,我会选择第二个选项。

我认为

int retVal = 0;
if (expression > 0)
{
    retVal = 1;
}
if (expression < 0)
{
    retVal = -1;
}
return retVal;

这在性能方面看起来并不正确,原因是每次它都在进行条件匹配。

相反,在以下情况下,这将匹配,直到它找到正确的条件并忽略其余

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}

我认为if/elseif/else比性能好从可读性的角度来看,您也可以使用案例我认为性能方面,如果else-if比多个if更好的选择

如问题中所述"我的问题也不在于性能,而在于编码标准和可读性。"

对于简单的if和then else情况,您可以使用三元运算符,但如果使用三元操作符检查多个条件,它将无法保持可读性。

return expression > 0 ? -1 : 0; 

对于具有多个检查的条件,请使用if和else if,正如您在问题中提供的那样。

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}

在收到@Chris和@InBetween

的备注后,此答案已更新