多个if块或单个if条件

时间:2010-04-22 09:29:22

标签: c# coding-style

如果我需要检查多个条件,这是与性能相关的首选方式

if( CND1 && CND2 && CND3 && CND4)
{
}
else
{
}

  if(CND1)
{
   if(CND2)
   {
      if(CND3)
      {
         if(CND4)
         {
         }
         else
         {
         }
      }
      else
      {
      }
   }  
else
   {
   }
}
    }

4 个答案:

答案 0 :(得分:5)

性能是相同的,因为它会在找到错误的参数(短路)后停止检查参数,所以一定要使用第一个参数。它与one,10相比是一行。这也意味着你的else将更容易处理。

答案 1 :(得分:4)

它们在性能方面是相同的,但第一种形式的可读性更高。

我将条件分开的唯一情况是,如果有一组逻辑条件:

if (x && y) // x and y are related
{
   if (a && b) // a and b are related
   {
   }
}

虽然其中一个可以很好地读取(但确实评估了更多条件)的替代方案是:

bool shouldPayBackDebt = x && y;
bool haveEnoughFunds = a && b;
if (shouldPayBackDebt && haveEnoughFunds)
{
    // ...
}

答案 2 :(得分:1)

Performancewise他们是一样的。 &&被短路,因此如果CND1为假,则不会评估其余内容。

答案 3 :(得分:1)

C#使用short-circuit evaluation,因此性能方面,两者都应该相同。

在没有短路评估的语言中,后者可能会更有效率,但与所有优化一样,您应该进行基准测试以确定是否存在性能增益,并确定该增益是否值得制作代码明显更复杂,维护更少。

此外, 可能这样的“优化”可能实际上不是优化。如果条件很便宜,并且额外的复杂性增加了代码的大小,使得它现在(例如)不再适合缓存,它实际上可以很好地执行 less

从编码风格的角度来看,这应该是你想要用else做什么的。如果你想在所有为真的情况下做一件事而在任何为假的情况下做另一件事,那就选择前者。如果您希望能够根据哪些条件做错而做不同的事情,请使用后者。

这不是风格问题,而是你要实现的目标。当然,如果你想做同样的事情,如果有的话是假的,你应该使用第一个表格,所以你不会在每个其他块中都有相同的重复代码。如果有疑问,有两种方法可以实现相同的要求,那么选择最简单,最清晰,最易维护的选项总是一个好主意。

哦,如果你不知道,如果你想急切地评估C#中的条件,你可以使用&|而不是&&和{{1} }。因此,如果您想要运行所有条件(可能是副作用),您可以这样做:

||

这里要记住的一件事是,这看起来与短路版非常相似,所以非常值得评论,特别是如果C或C ++人可能正在查看代码。 / p>

另外,我发现以下惰性结构非常有用:

if (CND1 & CND2 & CND3 & CND4) { // Eagerly evaluate all conditions.
    ...
}
else {
    ...
}

但严格的等同物看起来太相似了:

ok = ok && CND;

因此,我确保将这样的代码重新考虑到:

ok = ok & CND;

这使得行为上的差异更加明显。