下面首先比较各种遍历集合的方式:
1
int [] foo = new int[100];
2
3
// Loop 1:
4
foreach ( int i in foo)
5
Console.WriteLine( i.ToString( ));
6
7
// Loop 2:
8
for ( int index = 0;
9
index < foo.Length;
10
index++ )
11
Console.WriteLine( foo[index].ToString( ));
12
13
// Loop 3:
14
int len = foo.Length;
15
for ( int index = 0;
16
index < len;
17
index++ )
18
Console.WriteLine( foo[index].ToString( ));
第一种是foreach,第二种是传统的for,第三种看似对第二种做了“优化”。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

有过C++经验的人都会觉得第三种的优化很正常,但是C#的编译器可不这么想。由于C#强调安全编程,对象的访问都会检查是否越界。不管我们是不是自己保证不越界,编译器都会帮我们进行越界检查。因此,第三种实际上会产生两次下标检查。
1
// Loop 3, as generated by compiler:
2
int len = foo.Length;
3
for ( int index = 0;
4
index < len;
5
index++ )
6

{
7
if ( index < foo.Length )
8
Console.WriteLine( foo[index].ToString( ));
9
else
10
throw new IndexOutOfRangeException( );
11
}
是的,编译器确实做了两次下标检查,呵呵,帮倒忙了。
2

3

4

5

6



7

8

9

10

11

