黑马程序员--C#中for和foreach的区别

来源:互联网 发布:spark快速大数据分析 编辑:程序博客网 时间:2024/05/24 06:37

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

刚学c#不久,之前一直没在意for和foreach,一直认为这两个都可以随意使用,即能用for的地方,也能用foreach代替,反正亦然。

但,自从深入学习之后才发现原来这两家伙是有区别的,好吧,那就趁这个机会把他们搞搞清楚。

结构篇:
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下: 

foreach (type identifier in expression)

{

statement


其中: 

type 
identifier 的类型。 
identifier 
表示集合元素的迭代变量。如果迭代变量为值类型,则无法修改的只读变量也是有效的。 
expression 
对象集合或数组表达式。集合元素的类型必须可以转换为 identifier 类型。请不要使用计算为 null 的表达式。 
而应计算为实现 IEnumerable 的类型或声明 GetEnumerator 方法的类型。在后一种情况中,GetEnumerator 应该要么返回实现 IEnumerator 的类型,要么声明 IEnumerator 中定义的所有方法。 

statement 
要执行的嵌入语句。

原理篇:
在foreach循环中,迭代集合collectionObject的过程如下:
(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得。但这是可选的。
(2)调用返回的IEnumerator接口的MoveNext()方法。
(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
(4)重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。


替代foreach实现:
foreach (XXX a in b){ 
... 


等同于

XXX a;
IEnumerator ie = (IEnumable)b.GetEnumerator(); 
while (ie.MoveNext) { 
a = (XXX)ie.Current; 
...
}


-------Windows Phone 7手机开发、.Net培训、期待与您交流! -------
原创粉丝点击