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

use*_*322 19 .net c# performance if-statement return

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

bool Case1()
{
    if (A)
        return true;
    else
        return false;
}
bool Case2()
{
    if (A)
        return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

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

Son*_*nül 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
Run Code Online (Sandbox Code Playgroud)

看看这些代码的表现;

http://ideone.com/8Sc7Ho - >内存:33856 kB

http://ideone.com/MrnaAl - >内存:33808 kB

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


Wil*_*ean 6

对于这两种情况,c#编译器应生成相同的IL,因此性能应该没有差异.如果您对实际发生的事情感到好奇(尝试教授如何捕鱼),您始终可以查看生成的IL.

恕我直言,Case1更容易阅读,这是值得的.我的第二选择是return A;(正如其他一些答案所述).如果A不是bool,则存在隐式转换,在某些情况下可能会令人困惑.

我认为,可读性应该赢,除非你能证明与你有问题分析器.

  • "c#编译器将生成相同的MSIL" - 已验证? (4认同)

Nom*_*Sim 5

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

return A;
Run Code Online (Sandbox Code Playgroud)

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

bool Case3()
{
    bool retValue;
    if (A)
    {
        retValue = true;
    } 
    else
    { 
        retValue = false;
    }
    return retValue;
}
Run Code Online (Sandbox Code Playgroud)

这样你就很清楚发生了什么,以及要返回什么值。如果您需要返回并更改该方法的功能,则要容易得多。

  • 是的。布尔表达式必须驻留在 if 语句或循环语句中是一个非常普遍的想法,但布尔表达式就像任何其他表达式一样。没有人会这样编码:`if (x==1) return 1; 否则 if(x==2) 返回 2; 否则如果 (x==3) 返回 3; ...`. 为什么用布尔值做这个? (3认同)