如果在第一次“返回”之后有一个“else”,那么性能是否重要?

时间:2012-12-31 14:47:18

标签: c# .net performance if-statement return

我现在已经看到了两种不同的方法来制作布尔返回方法:

bool Case1()
{
    if (A)
        return true;
    else
        return false;
}
bool Case2()
{
    if (A)
        return true;
    return false;
}

哪一个更快?不写else只是为了保存一条线,使它更清晰,还是可以忽略不计的性能增益?

5 个答案:

答案 0 :(得分:35)

没有

即使我们查看他们的IL代码,他们也有相同的IL代码,因此它们之间没有性能差异。 使用更具可读性的

.method private hidebysig instance bool  Case1() cil managed
{
  // Code size       9 (0x9)
  .maxstack  1
  .locals init ([0] bool CS$1$0000,
           [1] bool CS$4$0001)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.1
  IL_0003:  ldc.i4.1
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method Program::Case1

看看这些代码的表现;

  

http://ideone.com/8Sc7Ho - >记忆:33856 kB

     

http://ideone.com/MrnaAl - >记忆:33808 kB

因此,如果您使用它们甚至10,000次,则无需担心。

答案 1 :(得分:6)

c#编译器应该为这两种情况生成相同的IL,因此性能应该没有区别。如果你好奇实际发生了什么(试图教如何捕鱼),你总是可以view the generated IL

恕我直言,Case1更容易阅读,这是值得的。我的第二选择是return A;(如其他答案中所述)。如果A不是bool,则存在隐式转换,在某些情况下可能会造成混淆。

我认为可读性应该会获胜,除非您能够使用分析器证明您有问题。

答案 2 :(得分:4)

没有(可忽略的)差异。从编码的角度来看,你真的应该这样做:

return A;

但是假设代码只是一个例子,那么我建议:

bool Case3()
{
    bool retValue;
    if (A)
    {
        retValue = true;
    } 
    else
    { 
        retValue = false;
    }
    return retValue;
}

通过这种方式,您可以清楚地了解正在发生的事情以及要返回的价值。如果您需要返回并更改该方法的功能,则更容易。

答案 3 :(得分:1)

表现明智,他们是一样的。从良好的编码实践角度来看,更喜欢后者 - 因此很明显函数总是返回有效值。

答案 4 :(得分:0)

他们是一样的。

如果A为false,则在两种情况下都会跳转到return false语句。