C# elseif vs. else{if} speed

本文关键字:if speed else elseif vs | 更新日期: 2023-09-27 17:50:59

下面哪个更快?

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

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

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

C# elseif vs. else{if} speed

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

我在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指令,但这是因为我在调试模式下编译了我的应用程序。在发布模式下,没有区别。

结果没有差别。

c#中没有elseif,所以else if只是包含另一个ifelse

ifelse后面跟着单个语句时,不需要括号,并且可以在语句周围添加括号。你可以堆叠几个括号,结果仍然是一样的:

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

通过添加括号,您可以看到的唯一区别是它创建了一个作用域,但它仅被编译器用于确定标识符的作用域,编译后的代码仍然是相同的。

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

if

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

也可以在

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

现在,想象一下else后面的if条件是一行语句…

if 
  ...
else 
  if ()
  {
  }

考虑

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

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

现在考虑以下代码

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

现在在上面的代码中,如果condition1为假,控制将只在condition2为真时进行。

所以从这个参考

因为在IF - ELSE IF - ELSE树中只执行一条语句。如果先前的表达式为FALSE, ELSE IF可以提供一个选项来执行其他东西,它可能非常有用,因为ELSE IF的语句只有在表达式被求值为TRUE时才会执行,而另一方面,如果IF的表达式被求值为FALSE, ELSE的语句将始终被执行。