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
是编译成一个语句还是编译成与第二个语句相同的逻辑?
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
只是包含另一个if
的else
。
当if
或else
后面跟着单个语句时,不需要括号,并且可以在语句周围添加括号。你可以堆叠几个括号,结果仍然是一样的:
{
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的语句将始终被执行。