一个疑问

摘自: more effective c#

 

9. 对数组跟集合使用foreach

循环数组或集合有三种方式:

 

int[] foo = new int[100];

 

第一种:

 

  1.  
    foreach(int i in foo)
  2.  
    {
  3.  
    // do somethings.
  4.  
    }

第二种:

 

 

  1.  
    for (int index = 0; index < foo.Length; index++)
  2.  
    {
  3.  
    // do somethings.
  4.  
    }

第三种:

 

 

  1.  
    int len = foo.Length;
  2.  
    for (int index = 0; index < len; index++)
  3.  
    {
  4.  
    // do somethings.
  5.  
    }

对于C或C++,第三种循环效率最佳。但是在C#中是最差的,因为在访问每一个实际的集合时,运行时确保对每个集合的边界做检测。而将集合的大小赋值给一个变量,这使得每次进行for循环第二个条件参数总需要对边界进行两次检测。并使得JIT编译器在生成代码的时候做了更多的事情。??????????????????

 

原始的C#编译器对第二种循环效率是最佳的,反而foreach循环效率差,主要是因为涉及到装箱操作。而数组类型是安全的情况下,foreach可以为数组生成不一样的IL代码,使得效率跟第二种循环一样。并且使用foreach可以写更少的代码。

 

posted @ 2018-09-17 11:07  时空观察者9号  阅读(138)  评论(0编辑  收藏  举报