您的位置:首页 > 其它

foreach 循环不能改变集合中各项的值

2011-07-30 10:50 225 查看
C#的foreach 语句不会解析为IL 代码中的foreach 语句。C#编译器会把foreach 语句转换为

IEnumerable 接口的方法和属性。下面是一个简单的foreach 语句,它迭代persons 数组中的所有元素,

并逐个显示它们:

foreach (Person p in persons)

{

Console.WriteLine(p);

}

foreach 语句会解析为下面的代码段。首先,调用GetEnumerator()方法,获得数组的一个枚举。

在while 循环中-- 只要MoveNext()返回true-- 用Current 属性访问数组中的元素:

IEnumerator enumerator = persons. GetEnumerator();

while (enumerator.MoveNext())

{

Person p = (Person) enumerator.Current;

Console.WriteLine(p);

}

C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用foreach,而不直接操作枚举数。

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置上,Current
属性未定义。因此,在读取 Current 的值之前,必须调用
MoveNext 方法将枚举数提前到集合的第一个元素。

在调用 MoveNextReset 之前,Current 返回同一对象。MoveNextCurrent 设置为下一个元素。

如果 MoveNext 越过集合的末尾,则枚举数将被放置在此集合中最后一个元素的后面,而且 MoveNext 返回false。当枚举数位于此位置时,对
MoveNext 的后续调用也返回 false。如果上一个MoveNext 调用返回
false,则 Current 未定义。若要再次将Current 设置为集合的第一个元素,可以调用
Reset,然后再调用 MoveNext

只要集合保持不变,枚举数就保持有效。如果对集合进行更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,而且其行为是不确定的。

枚举数没有对集合的独占访问权;因此,枚举通过集合在本质上不是一个线程安全的过程。若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐