如果-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
的相同情况。
根据工作领导的说法,
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
的相同情况。