代码之家  ›  专栏  ›  技术社区  ›  JNF

C#elseif与else{if}速度

  •  1
  • JNF  · 技术社区  · 12 年前

    以下哪一项更快?

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

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

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

    5 回复  |  直到 12 年前
        1
  •  5
  •   selkathguy    12 年前

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

    就像Soner Gnl在评论中所说的那样,你总是可以轻松地测试这个问题。

        2
  •  2
  •   Fabio Jim Dagg    12 年前

    我在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代码中发现了一些额外的No指令,但这是因为我在调试模式下编译了我的应用程序。在释放模式下,没有区别。

        3
  •  2
  •   Guffa    12 年前

    结果没有差别。

    没有 elseif 在C#中,所以 else if 只是一个 else 包含另一个 if .

    如果 其他的 后面跟着一个语句,并且可以在任何地方的语句周围添加括号。您可以堆叠几个括号,结果仍然相同:

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

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

        4
  •  1
  •   Noone    12 年前

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

    您可以有一个if条件,其中if中包含多行

    if 
    {
       // multiple statements
    }
    else 
    {
       // multiple statements
    }
    

    您还可以有一个if条件,其中包含单行语句

    if 
       // one line statement
    else
       // one line statement
    

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

    if 
      ...
    else 
      if ()
      {
    
      }
    
        5
  •  0
  •   Microsoft DN    12 年前

    考虑

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

    在上面的代码中,如果条件1为false,执行将转到else。然后在其他情况下,它将再次检查条件2是否为真。

    现在考虑以下代码

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

    现在在上面的代码中,如果条件1为false,则只有当条件2为true时,控制才会转到if-else。

    所以从 this 参考

    因为在IF-ELSE IF-EELSE树中只执行一条语句。如果前面的表达式为FALSE,ELSE IF可以提供执行其他语句的选项,这非常有用,因为ELSE IF的语句只有在其表达式求值为TRUE时才会执行;另一方面,如果IF的表达式求值为FALSE,则始终执行ELSE的语句。