ifs,否则ifs和多次返回

时间:2015-06-30 09:45:28

标签: c# if-statement coding-style

这不是关于链式 ifs ifs else 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;

当然还有第三种选择,规则是没有方法应该有多个return语句,当方法的复杂性很低时,我发现这种语句过于严格和繁琐:

int retVal;

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

return retVal;

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

4 个答案:

答案 0 :(得分:1)

考虑

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

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

如果所有三种情况(>0<0==0)都有些对称,那么您的第一个选项对我来说很有用。

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

答案 1 :(得分:1)

有很多方法。您可以采用您展示的两种方法之一。你可以这样做:

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

或完全使用三元运算符:

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

另一个选择是使用功能方法,例如offered by my own SuccincT library并执行:

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

这完全是一个偏好问题,而且确实没有正确答案。

答案 2 :(得分: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 / else if / else是否优于性能 为了便于阅读,您也可以选择使用 案件 我认为性能明智,否则如果是比多个ifs更好的选择

答案 3 :(得分:-1)

  

正如问题中提到的那样   “我的问题也不是关于性能,而是关于编码   标准和可读性。“

你可以使用三元运算符来表示if和then的情况,但如果你使用三元运算符检查多个条件,它将无法保持可读性。

return expression > 0 ? -1 : 0; 

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

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

在收到@Chris和@InBetween

的评论后,此答案已更新