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

本文详细解释了C# foreach语句如何解析为内部的枚举数操作,包括如何获取集合的枚举数、访问元素及注意事项。强调了使用foreach语句的便利性以及枚举数在集合遍历中的复杂性。

 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

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

枚举数没有对集合的独占访问权;因此,枚举通过集合在本质上不是一个线程安全的过程。若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值