我想知道嵌套if是否优于AND语句。我有一个循环,这么多次,所以我想更快的执行可用。下面是与我的代码具有相同逻辑的代码。嵌套的if语句位于循环内。
for ( int i = 0; i < array.length; i++)
{
// do stuff
if (x == 5)
{
if (y == 3)
{
// do stuff
}
}
}
如果我用这个And STATEMENT替换嵌套的if,我的代码是否会有显着差异?
if ((x == 5) && (y == 3))
// do stuff
我已阅读此link但我没有找到答案。我是一名学生,仍在学习,感谢所有的反馈!
答案 0 :(得分:9)
不,它在性能方面没有显着差异,但可读性可能存在差异。
使用优化/发布(使用LINQPad测试)编译时,这两个都将生成相同的IL
:
IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: ldc.i4.s 0A
IL_0004: stloc.1
IL_0005: ldloc.0
IL_0006: ldc.i4.5
IL_0007: bne.un.s IL_000D
IL_0009: ldloc.1
IL_000A: ldc.i4.3
IL_000B: pop
即使没有优化,差异也不显着:
嵌套语句:
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldc.i4.s 0A
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldc.i4.5
IL_0008: ceq
IL_000A: ldc.i4.0
IL_000B: ceq
IL_000D: stloc.2
IL_000E: ldloc.2
IL_000F: brtrue.s IL_0020
IL_0011: nop
IL_0012: ldloc.1
IL_0013: ldc.i4.3
IL_0014: ceq
IL_0016: ldc.i4.0
IL_0017: ceq
IL_0019: stloc.2
IL_001A: ldloc.2
IL_001B: brtrue.s IL_001F
IL_001D: nop
IL_001E: nop
非嵌套声明:
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldc.i4.s 0A
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldc.i4.5
IL_0008: bne.un.s IL_0013
IL_000A: ldloc.1
IL_000B: ldc.i4.3
IL_000C: ceq
IL_000E: ldc.i4.0
IL_000F: ceq
IL_0011: br.s IL_0014
IL_0013: ldc.i4.1
IL_0014: nop
IL_0015: stloc.2
IL_0016: ldloc.2
IL_0017: brtrue.s IL_001B
IL_0019: nop
答案 1 :(得分:3)
不,两者之间没有任何区别。但是,AND会减少行数并且更具可读性(如果没有那么多条件)
有些情况if
更好并且感觉更自然,一个常见的例子如下:
String s=//...
if(s==null)return;
if(s.Length > 0) //do something
使用AND,可以将其替换为:
if ((s!=null) && (s.Length > 0)) //Dosomething
许多开发人员都犯了这个错误:
if ((s.Length > 0) && (s!=null) ) //Dosomething
哪个将以空引用异常结束
正如您所看到的,在使用单独的if
时,首先考虑进行空检查更为自然
答案 2 :(得分:3)
.NET将停止检查条件的第一部分是否为false,因此两者之间不存在性能差异。
答案 3 :(得分:1)
在编译代码中,没有理由速度应该不同,它们将转换为完全相同的汇编代码。我绝对同意可读性因素,它也会缩短你班级的长度。