C# 用AND替换嵌套的if语句
我想知道嵌套if是否优于AND语句。我有一个循环,它运行了很多次,所以我考虑更快的执行。下面是与我的代码具有相同逻辑的代码。嵌套的if语句位于循环内C# 用AND替换嵌套的if语句,c#,nested-if,C#,Nested If,我想知道嵌套if是否优于AND语句。我有一个循环,它运行了很多次,所以我考虑更快的执行。下面是与我的代码具有相同逻辑的代码。嵌套的if语句位于循环内 for ( int i = 0; i < array.length; i++) { // do stuff if (x == 5) { if (y == 3) { // do stuff } } }
for ( int i = 0; i < array.length; i++)
{
// do stuff
if (x == 5)
{
if (y == 3)
{
// do stuff
}
}
}
我读过这篇文章,但没有找到答案。我是一名学生,还在学习,感谢所有的反馈 不,它在性能上不会有显著差异,但在可读性上可能会有差异 当使用优化/发布(使用LINQPad测试)进行编译时,这两种方法将生成相同的
IL
:
即使没有优化,差异也没有那么显著:
嵌套语句:
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
非嵌套语句:
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
不,两者之间没有任何区别。但是,AND使行数更少,可读性更强(如果您没有那么多条件) 在某些情况下,
如果
s更好,感觉更自然,一个常见的例子如下:
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
这将导致空引用异常
如您所见,在使用separate
if
s时,更自然地考虑首先执行空检查。如果条件的第一部分为false,NET将停止检查,因此两者之间不会有性能差异。在编译代码中,速度没有理由不同,它们将转换为完全相同的汇编代码。我当然同意可读性因素,它也会缩短类的长度。@Almo,在不需要时使用嵌套的if语句会导致所有符号的可读性降低,但这是主观的(可能):)我同意你的观点,但“但在可读性方面”这句话没有任何意义。具有讽刺意味的是,它对可读性进行了评论,而本身并不可读。:)@阿尔莫,哈,我想我得把这归咎于我不是一个以英语为母语的人!英语可能不像法语那么难学,但也不容易。:)它们将被编译到同一个程序集(在这段代码中),所以它们之间没有任何区别。这个逻辑也发生在AND语句中吗?这就是我的意思。在and语句中,如果前半部分为false,它就不会麻烦检查后半部分。这称为短路,所有逻辑运算符都会尽可能短路,这意味着如果它们知道结果必须为true/false,它们会立即停止执行任何其他语句,因为它们不会影响结果。