根据工作线索,
if (invalid) {
...some code
}
if (!invalid) {
...some code
}
和
if (invalid) {
...some code
} else {
...some code
}
可以解释为一种样式选择。我想知道人们在哪里划定界线,您会怎么看?
PS:是的,我知道否定不应该是if语句的“名义”情况。请忽略这一点,因为我试图准确复制引起讨论的问题代码。
答案 0 :(得分:4)
这里不仅有冗余,而且根据语言的不同,正确性/有效性也会有所不同。考虑以下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
中,执行将恰好流入这些分支之一。在“两个if语句”样式中,语言规则不能保证这一点。
答案 1 :(得分:1)
这绝对不是样式选择。
如果您有两个单独的if
,则该表达式将被有效评估两次。表达式可能很复杂,甚至可能是一个方法,该方法可能会产生副作用:
if (someMethod()) {
}
if (!someMethod()) {
}
区别应该很明显。
还要注意,if-else
与编译器有所不同,因为编译器可以确保可以正确执行两个路径之一。这对于检测无法访问的代码,未初始化的变量和类似情况具有影响。
通常,编译器无法通过两个单独的if
来检测相同的情况。