以下哪个更快?
if {...}
else if{...}
或
if {...}
else {if{...}}
else if
是编译成一个语句还是编译成与第二个语句相同的逻辑?
答案 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
。
当if
或else
后跟单个语句时,不需要括号,并且可以在任何地方的语句周围添加括号。你可以叠加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语句。