1、foreach
foreach依赖IEnumerable接口。
第一次var a in GetList()时调用GetEnumerator()返回第一个对象并赋给a,以后每次再执行 var a in GetList() 的时候仅调用MoveNext,直到循环结束。在循环期间GetList()方法只执行一次。
1 foreach (var a in GetList()) 2 { 3 ... 4 } 5 6 //与下面具有相同功能 7 8 var a; 9 IEnumerator e = GetList().GetEnumerator(); 10 while (e.MoveNext) 11 { 12 a = e.Current; 13 }
2、for
for循环靠下标定位,list[3] 相当于 *(list + 3)。
1 for(int i = 0; i < GetCount(); i++) 2 { 3 .... 4 } 5 6 //与下面具有相同功能 7 8 int i = 0; 9 10 while(i < GetCount()) 11 { 12 ... 13 }
3、
for循环每次循环会调用GetCount()来比较长度,而foreach不考虑长度,只调用一次GetList()。并且foreach的时候会锁定集合中的对象,期间不能修改。
4、小结
在固定长度或长度不需要计算的时候for循环效率高于foreach。
在不确定长度,或计算长度有性能损耗的时候,用foreach比较方便。
时间: 2024-11-10 13:53:28