嵌套或不嵌套的if-blocks?

时间:2009-11-01 15:21:15

标签: c# .net

我想知道在C#中使用ifs时是否存在性能差异,它们是否嵌套。这是一个例子:

if(hello == true) {
    if(index == 34) {
        DoSomething();
    }
}

这比这更快或更慢:

if(hello == true && index == 34) {
    DoSomething();
}

有什么想法吗?

8 个答案:

答案 0 :(得分:14)

编译器可能足够智能,可以为两个版本生成相同或非常相似的代码。除非性能确实是您应用程序的关键因素,否则为了代码可读性,我会自动选择第二个版本。

答案 1 :(得分:5)

更好的是

if(SomethingShouldBeDone()) {
    DoSomething();
}

......同时在这个城市的另一个地方...

private bool SomethingShouldBeDone()
{
    return this.hello == true && this.index == 34;
}

在99%的现实生活中,这对性能影响很小或没有影响,并且只要你有意义地命名,就会更容易阅读,理解和(因此)维护。

答案 2 :(得分:2)

使用最可读且仍然正确的(有时在布尔表达式周围玩杂耍会让你有不同的行为 - 特别是如果涉及短路)。执行时间将是相同的(或太接近于重要)。

仅仅为了记录,有时候我发现嵌套更具可读性(如果表达式太长或者组件太多),有时我发现它的可读性较差(如在你的简短示例中)。

答案 3 :(得分:2)

任何现代编译器,我的意思是在过去20年中构建的任何东西,都会将这些编译器编译成相同的代码。

至于你应该使用哪个,那么它取决于项目上下文中哪个更具可读性和逻辑性。一般来说,我会选择第二个,但这会有所不同。

值得考虑的一个重点是维护。我追捕的一个比较常见的错误是在嵌套ifs块中间悬挂if / else。如果你有一系列复杂的if else条件,这些条件已被不同的程序员在一段时间内修改 - 通常是几年。例如,对于一个简单的情况使用伪代码:

IF condition_a
  IF condition_b
    Do something
  ELSE
    Do something
  END IF
ELSE
  IF condition_b
    Do something
  END IF
END IF

你会注意到这个组合!condition_a&& !condition_b代码将通过条件无效。这对于这对条件来说很容易找到,但是一旦你有3个,4个或更多if / else条件要检查就很容易错过。通常发生的是嵌套结构在第一次编码时是正确的,但在稍后的某些时候变得不正确(就业务输出而言),因为维护程序员不会理解或允许全部选项。

因此,随着时间的推移,使用if结构中的组合条件进行编码通常会更加健壮,采用最可行的结构并将嵌套保持在最小值,因此使用您的示例,因为没有逻辑上的理由不将这两个条件组合成一个单一陈述然后你应该这样做

答案 4 :(得分:0)

我看不出两者之间会有任何明显的性能差异,但我认为第二选项更具可读性。

答案 5 :(得分:0)

我不相信您在两次实施之间可能会遇到任何性能差异。

无论如何,我会选择后者,因为它更具可读性。

答案 6 :(得分:0)

取决于编译器。当嵌套 if 结束后,但在外部结束之前有代码时,差异会更明显。

答案 7 :(得分:0)

我经常自己想知道这件事。但是,似乎选项之间确实没有区别(或者说不多)。可读性方面,第二个选项更具可读性,因此我通常会选择那个选项,除非我因为某种原因预计必须针对每个条件进行专门编码。