如果-else 与 if not-if

If-else vs if not-if

根据工作领导的说法,

if (invalid) {
   ...some code
}

if (!invalid) {
  ...some code
}

if (invalid) {
  ...some code
} else {
  ...some code
}

可以理解为风格的选择。我想知道人们在哪里划清界限,你会怎么想。

PS:是的,我知道否定不应该是 if 语句的 'nominal' 情况。请忽略它,因为我试图准确复制引发讨论的相关代码。

不仅这里有冗余,而且根据语言的不同,correctness/validity也可能存在差异。考虑这个 C# 代码:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
else            
{
    value = 20;
}
// No problem, value is definitely assigned
Console.WriteLine(value);

完全正确。但是如果我们用冗余的方式来写,我们会得到一个编译时错误:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
if (!condition)
{
    value = 20;
}
// error CS0165: Use of unassigned local variable 'value'
Console.WriteLine(value);

在 Java 中也是如此,我怀疑在许多其他语言中也是如此。编译器可以考虑这样一个事实,即在 if/else 中,执​​行将恰好流入这些分支之一。在 "two if statements" 风格中,语言规则不提供这种保证。

这绝对不是风格选择。

如果您有两个单独的 if,那么表达式实际上会计算两次。表达式可以很复杂,甚至可以是一个方法,那个方法可能有副作用:

if (someMethod()) {
}

if (!someMethod()) {
}

区别应该很明显。

另请注意,if-else 对编译器有影响,因为编译器可以确定可以执行两个路径中的一个。这会对检测无法访问的代码、未初始化的变量和类似情况产生影响。

通常编译器无法检测到具有两个单独 if 的相同情况。