C# Ifs、else Ifs和多重返回

C# Ifs、else Ifs和多重返回,c#,if-statement,coding-style,C#,If Statement,Coding Style,这不是关于链式ifs或ifs和else ifs的问题。我已经在网上看到了很多这样的问题 我的问题也不是关于性能,而是关于编码标准和可读性 考虑一下我在一个项目中经常看到的以下琐碎伪代码: if (expression > 0) { return 1; } else if (expression < 0) { return -1; } else { return 0; } if(表达式>0) { 返回1; } else if(表达式0) { 返回1; } if

这不是关于链式ifs或ifs和else ifs的问题。我已经在网上看到了很多这样的问题

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

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

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}
if(表达式>0)
{
返回1;
}
else if(表达式<0)
{
返回-1;
}
其他的
{
返回0;
}
我通常用一种稍微不同的方式写这种结构:

if (expression > 0)
{
    return 1;
}

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

return 0;
if(表达式>0)
{
返回1;
}
if(表达式<0)
{
返回-1;
}
返回0;
当然还有第三种选择,即任何方法都不应该有多个return语句,当方法的复杂性较低时,我发现这些语句限制性太强,太麻烦了:

int retVal;

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

return retVal;
int-retVal;
如果(表达式>0)
{
retVal=1;
}
else if(表达式<0)
{
retVal=-1;
}
其他的
{
retVal=0;
}
返回返回;
在编写这些类型的构造时,上面列出的选项之一是否更正确?就性能而言,我知道选择是完全不相关的,但从可读性的角度来看,我倾向于避免使用if-else-if语句。也就是说,许多同事不同意我的观点,即使他们不能给我任何令人信服的论据。

考虑一下

return expression < 0? -1:
       expression > 0? +1:
       0;
返回表达式<0-1:
表达式>0+1:
0;
一般来说,它在很大程度上取决于偏好和语义

如果这三种情况(
>0
0
我认为

int retVal = 0;

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

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

return retVal;
int-retVal=0;
如果(表达式>0)
{
retVal=1;
}
if(表达式<0)
{
retVal=-1;
}
返回返回;
这看起来在性能方面并不正确,原因是每次都在进行条件匹配

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

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}
if(表达式>0)
{
返回1;
}
else if(表达式<0)
{
返回-1;
}
其他的
{
返回0;
}
我认为if/else if/else比性能更好 从可读性的角度来看,您也可以使用 案例
我认为性能方面的if-else-if比多个if更好。有许多方法。您可以采用您展示的两种方法之一。您可以:

if (expression == 0)
{
    return 0;
}
return expression < 0 ? -1 : 1;
if(表达式==0)
{
返回0;
}
返回表达式<0-1:1;
或完全使用三元运算符:

return expression == 0
    ? 0
    : expression < 0 ? -1 : 1;
返回表达式==0
? 0
:表达式<0?-1:1;
另一种选择是使用功能性方法,如and do:

return expression.Match().To())
其中(e=>e<0).Do(-1)
其中(e=>e>0).Do(1)
.Else(0.Result();
这都是偏好的问题,确实没有一个正确的答案

如问题所述 “我的问题也不是关于性能,而是关于编码 标准和可读性。”

对于简单的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;
}
if(表达式>0)
{
返回1;
}
else if(表达式<0)
{
返回-1;
}
其他的
{
返回0;
}

在得到@Chris和@InBetween的评论后,这个答案已经更新。这是一个偏好问题。这是关于你喜欢什么。我认为第一个选项看起来最好,因为它以逻辑方式将相关的if分组在一起。如果你(可以)跳过大括号看起来会更整洁。下层选民愿意发表评论吗?@InBetween:当然。你的问题是没有好的或坏的答案。Stackoverflow不适合讨论这些事情。我更喜欢选项3。10多年来,我们避免使用“break”(除了switch语句)和“return”(功能结束时除外).经验表明,该编码标准提供了一些可读性优势,并且在调试模式下,在过程结束时设置单个断点也有一些优势。该示例过于简化。当返回语句稍微复杂时,我认为使用
运算符可能会妨碍可读性,sp特别是链接时。很抱歉,在性能方面,两个选项都是相同的;在到达任何给定的返回语句之前,两个实现都将计算相同数量的条件。@中间不为true。在第一个示例中,如果
expression>0
为true,它仍将计算
expression<0
,因为没有返回。哇很抱歉!我以为你在比较前两个选项。我已经编辑了我的答案,因为如果我误读了你的答案,没有其他选项,唯一的返回选项显然毫无意义。很抱歉,混淆了。我想说,任何嵌套的三元组都是完全不可读的。这样做绝对没有好处。很抱歉,但是我认为超过2个嵌套三元运算符是地狱。我倾向于避免甚至2个,并在代码审查时尽可能重构它们。@介于两者之间。正如我在回答中提到的,当你使用超过4-5个嵌套三元运算符时,这是一个建议,不可能管理和理解。因此,根据我的说法,使用4-5个嵌套三元运算符可能是理解的可以,但必须避免超出范围。我确实希望看到带有5个嵌套三元组的代码。我无法想象它是可读的。@Chris和中间人感谢您宝贵的建议。我已经更新了答案。
if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}