C# 用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 } } }

我想知道嵌套if是否优于AND语句。我有一个循环,它运行了很多次,所以我考虑更快的执行。下面是与我的代码具有相同逻辑的代码。嵌套的if语句位于循环内

   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,它们会立即停止执行任何其他语句,因为它们不会影响结果。