A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

王鹏程

中级黑马

  • 黑马币:7

  • 帖子:42

  • 精华:0

© 王鹏程 中级黑马   /  2013-3-28 15:46  /  2731 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王鹏程 于 2013-3-28 20:39 编辑

什么时候用for循环,什么时候用foreach,他们俩有什么区别?

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 苏冉 于 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
}

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
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是最佳的选择

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
1.当你需要把一个容器内的全部元素都要做一个操作的时候用foreach();
2.当你想精确控制循环的过程,对每个元素或者一定元素要做不同操作的时候,用for();

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 曾玉锋 于 2013-3-28 17:46 编辑

对于数组、ArrayList、List等集合用for取值或者遍历,而Directory、Hashtable等键值对集合用foreach遍历
因为:
foreach首先在内部会copy集合到内存,然后次第逐个遍历内存中的副本集合,无法改变顺序,也没有索引下标之说。效率较for循环遍历低。
对于无法用索引下标取得元素的键值对集合(Directory等)来说,可用foreach遍历。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
其实两者都差不多,但是更偏向程序员的用法!  foreach 语句用于循环访问集合,以获取程序员需要的信息,但不能用于在源集合中添加或移除项,否则可能产生不可预知的副作用。 如果需要在源集合中添加或移除项,就要使用 for 循环。for循环一般都用在计数或排序中使用,这样做也就相当于为每行数据打上序号。for循环在开发过程中占有极其重要的地位。
回复 使用道具 举报
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的时候会锁定集合中的对象.期间不能修改.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马