一个疑问
摘自: more effective c#
9. 对数组跟集合使用foreach
循环数组或集合有三种方式:
int[] foo = new int[100];
第一种:
-
foreach(int i in foo)
-
{
-
// do somethings.
-
}
第二种:
-
for (int index = 0; index < foo.Length; index++)
-
{
-
// do somethings.
-
}
第三种:
-
int len = foo.Length;
-
for (int index = 0; index < len; index++)
-
{
-
// do somethings.
-
}
对于C或C++,第三种循环效率最佳。但是在C#中是最差的,因为在访问每一个实际的集合时,运行时确保对每个集合的边界做检测。而将集合的大小赋值给一个变量,这使得每次进行for循环第二个条件参数总需要对边界进行两次检测。并使得JIT编译器在生成代码的时候做了更多的事情。??????????????????
原始的C#编译器对第二种循环效率是最佳的,反而foreach循环效率差,主要是因为涉及到装箱操作。而数组类型是安全的情况下,foreach可以为数组生成不一样的IL代码,使得效率跟第二种循环一样。并且使用foreach可以写更少的代码。