if、else if和多次返回
本文关键字:if 返回 else | 更新日期: 2023-09-27 18:00:37
这不是关于连锁的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;
当然,还有第三种选择,它遵循的规则是,任何方法都不应该有一个以上的返回语句,当方法的复杂性较低时,我觉得这太过限制和繁琐:
int retVal;
if (expression > 0)
{
retVal = 1;
}
else if (expression < 0)
{
retVal = -1;
}
else
{
retVal = 0;
}
return retVal;
在编写这些类型的构造时,上面列出的选项之一是否更正确?就性能而言,我知道这个选择完全无关,但从可读性的角度来看,我有点喜欢避免使用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