C#elseif与其他{if}速度

时间:2014-03-19 12:55:09

标签: c# performance if-statement

以下哪个更快?

if {...}
else if{...}

if {...}
else {if{...}}

else if是编译成一个语句还是编译成与第二个语句相同的逻辑?

5 个答案:

答案 0 :(得分:5)

else if大致相同。如果您选择以后一种方式编写它,编译器将生成完全相同的IL代码,但我认为这在很大程度上取决于您的构建设置,以及项目是为调试还是发布而构建,是否启用了优化等。一般来说,它们应该是相同的意图和目的,你可以这样对待它们。我的建议是你写哪个更易读

像SonerGönül在评论中所说的那样,你可以随便对此进行测试。

答案 1 :(得分:2)

我在C#控制台应用程序中编写了这些方法,并使用Telerik JustDecompile分析了生成的程序集的IL。

private int Method1(int x)
{
    int y = 0;
    if (x == 0)
    {
        y = 10;
    }
    else if (x == 1)
    {
        y = 20;
    }
    return y;
}

private int Method2(int x)
{
    int y = 0;
    if (x == 0)
    {
        y = 10;
    }
    else
    {
        if (x == 1)
        {
            y = 20;
        }
    }
    return y;
}

两种方法的IL结果相同。

.method private hidebysig 
    instance int32 Method1 (
        int32 x
    ) cil managed 
{
    .locals init (
        [0] int32 y
    )

    IL_0000: ldc.i4.0
    IL_0001: stloc.0
    IL_0002: ldarg.1
    IL_0003: brtrue.s IL_000a

    IL_0005: ldc.i4.s 10
    IL_0007: stloc.0
    IL_0008: br.s IL_0011

    IL_000a: ldarg.1
    IL_000b: ldc.i4.1
    IL_000c: bne.un.s IL_0011

    IL_000e: ldc.i4.s 20
    IL_0010: stloc.0

    IL_0011: ldloc.0
    IL_0012: ret
}
编辑:在我的第一个回答中,我告诉我在生成的IL代码中发现了一些额外的Nop指令,但这是因为我已经在调试模式下编译了我的应用程序。在发布模式下,没有不同之处。

答案 2 :(得分:1)

我不能说编译代码是什么,但让我们这样看:

你可以在if

中包含多行包含if条件
if 
{
   // multiple statements
}
else 
{
   // multiple statements
}

你也可以在

中使用单行语句的if条件
if 
   // one line statement
else
   // one line statement

现在,假设else之后的if条件是一行语句......

if 
  ...
else 
  if ()
  {

  }

答案 3 :(得分:1)

结果没有区别。

C#中没有elseif,因此else if只是else,其中包含另一个if

ifelse后跟单个语句时,不需要括号,并且可以在任何地方的语句周围添加括号。你可以叠加seveal括号,结果仍然是相同的:

{
  if (something) {
    {
      {
        // do something
      }
    }
  } else {
    {
      {
        {
          if (something) {
            {
              // do something
            }
          }
        }
      }
    }
  }
}

通过添加括号可以看到的唯一区别是它创建了一个范围,但只有编译器用它来确定标识符的范围,编译后的代码仍然是相同的。

答案 4 :(得分:0)

考虑

if(condition1)
{
      // code
}
else
{
     if(condition2)
     {
         // code
     }
}

在上面的代码中,如果condition1为false,则执行else。然后在else中它将再次检查condition2是否为真。

现在考虑以下代码

if(condition1)
{
    // code
}
else if(condition2)
{
    // code        
}

现在在上面的代码中,如果condition1为false,只有当condition2为真时,控制才会转到if。

所以来自this参考

由于在IF-ELSE IF-ELSE树中只执行一个语句。如果前面的表达式为FALSE,则ELSE IF可以提供执行其他操作的选项,并且它非常有用,因为只有当ELSE IF的表达式在另一方面ELSE&#被评估为TRUE时才会被执行。 39;如果IF的表达式被评估为FALSE,则将始终执行s语句。