黑马程序员技术交流社区

标题: 关于for循环和foreach循环的问题 [打印本页]

作者: 王鹏程    时间: 2013-3-28 15:46
标题: 关于for循环和foreach循环的问题
本帖最后由 王鹏程 于 2013-3-28 20:39 编辑

什么时候用for循环,什么时候用foreach,他们俩有什么区别?
作者: 苏冉    时间: 2013-3-28 16:06
本帖最后由 苏冉 于 2013-3-28 16:11 编辑

for循环需要给出初值、末值和步长

foreach循环则不需要事先给定初值、末值和步长,它会自动遍历给定集合体所有值

当你需要把一个容器内的全部元素都要做一个操作的时候用foreach();

当你想精确控制循环的过程,对每个元素要做不同操作的时候,必须用for();
看一下代码:
string[] a=new string[]{"a","b"}

for(i=0;i<a.length;i++)
{
Response.write(a.ToString())
}

foreach(string b in a)
{
Response.write b
}

作者: 邓建军    时间: 2013-3-28 16:31
1.for循环并不依赖于数组或其他形式的组式数据结构,只是简单的
在调用了代码后,进行一个判断,判断是否要继续。
(非常类似于do..while和while循环--在这里不作具体分析了^_^~~)
2.foreach循环如果作用在一个基于System.Array的类型之上的数组的话,编译器会自动优化成与for循环非常类似
的代码,只是调用的指命有细微的差别,并且检查(包括编译阶段和运行时)会比for严格的多
3.foreach循环作用在一个非System.Array类型上(且一定要是实现了IEnumerable接口的类),会先调用
IEnumerable.GetEnumerator()方法获取一个Enumertor实例,再在获取的Enumertor实例上调用
GetCurrent()和MoveNext()方法,最后判断如果Enumertor实例如果实现了IDispose接口,就自动调用
IDispose.Dispose()方法!

那么我们应该分别在那些地方用for和foreach捏
建议:
1.在有对所循环的本体(System.Array)做赋值操作时,尽量不要用Foreach()。
2.foreach比for更灵活。(可在MoveNext()和GetCurrent()里编写自己的代码).
自己编写的类如果实现了IEnumerable接口的话,就可以用foreach循环了,而不管内部是否有一个真实的数组,
并且可以自定义循环的规则。
3.从OO的原则看,foreach循环更适于多数情况的使用
(事实上,foreach的实现是典型的Iterator模式,下面有简单的描述它的好处)
想用统一的调用循环接口时,foreach是最佳的选择
作者: coolfeiweb    时间: 2013-3-28 17:05
1.当你需要把一个容器内的全部元素都要做一个操作的时候用foreach();
2.当你想精确控制循环的过程,对每个元素或者一定元素要做不同操作的时候,用for();
作者: 曾玉锋    时间: 2013-3-28 17:45
本帖最后由 曾玉锋 于 2013-3-28 17:46 编辑

对于数组、ArrayList、List等集合用for取值或者遍历,而Directory、Hashtable等键值对集合用foreach遍历
因为:
foreach首先在内部会copy集合到内存,然后次第逐个遍历内存中的副本集合,无法改变顺序,也没有索引下标之说。效率较for循环遍历低。
对于无法用索引下标取得元素的键值对集合(Directory等)来说,可用foreach遍历。
作者: HM邱刚权    时间: 2013-3-29 15:41
其实两者都差不多,但是更偏向程序员的用法!  foreach 语句用于循环访问集合,以获取程序员需要的信息,但不能用于在源集合中添加或移除项,否则可能产生不可预知的副作用。 如果需要在源集合中添加或移除项,就要使用 for 循环。for循环一般都用在计数或排序中使用,这样做也就相当于为每行数据打上序号。for循环在开发过程中占有极其重要的地位。
作者: 管章鹏    时间: 2013-3-29 15:53
foreach 依赖 IEnumerable.第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束
期间GetList()方法只执行一次.
foreach   (var a in GetList())
{
    ...
}

=

var a;
IEnumerator  e  =  GetList().GetEnumerator();
while (e.MoveNext)
{
    a = e.Current;
}
for 循环靠下标定位.    list[3] 相当于 *(list + 3).
for(int i = 0; i < GetCount(); i++)
{
  ....
}

=

int i = 0;

while(i < GetCount())
{
  ...
}
for 循环每次循环会调用 GetCount() 来比较长度. 而 foreach 不考虑长度,只调用一次GetList().

结论.
在固定长度或长度不需要计算的时候for循环效率高于foreach.

在不确定长度,或计算长度有性能损耗的时候,用foreach比较方便.

并且foreach的时候会锁定集合中的对象.期间不能修改.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2