如果在第一个“返回”之后有一个“else”,这对性能明智吗?

本文关键字:性能 else 第一个 返回 之后 如果 有一个 | 更新日期: 2023-09-27 17:50:03

我已经看到了创建布尔返回方法的两种不同方法:

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

哪一个更快?不写else只是为了节省一行,让它更清晰,或者有一个可以忽略不计的性能增益,这有意义吗?

如果在第一个“返回”之后有一个“else”,这对性能明智吗?

No.

甚至当我们看它们的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

所以即使你用了一万次,也没什么好担心的。

c#编译器应该为这两种情况生成相同的IL,因此在性能上应该没有区别。如果你想知道实际发生了什么,你可以随时查看生成的IL(试图教如何钓鱼)。

IMHO, Case1更容易阅读,这是有价值的。我的第二个选择是return A;(正如其他一些答案中提到的)。如果A不是bool,则存在隐式转换,在某些情况下可能会令人困惑。

我认为可读性应该胜出,除非你可以用分析器证明有问题。

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

return A;

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

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

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

性能方面它们是相同的。从良好的编码实践的角度来看,更倾向于后者——这样函数总是返回一个有效值就很清楚了。

它们是一样的

如果A为假,在两种情况下都将跳转到return false语句