情况是这样的:
我正在浏览一些代码,我想知道下面的语句是接受所选集合的引用,还是在foreach循环结束时用来替换原始对象的副本。如果是第一个,它会将新找到的页面加入到循环中吗?
foreach(Page page in Pages)
{
page.AddRange(RetrieveSubPages(page.Id));
}编辑:对不起,我打错了。
应该是这样的:
foreach(Page page in pages)
{
pages.AddRange(RetrieveSubPages(page.Id));
}我想说的是,如果我将一些对象添加到枚举集合中,它会在foreach中联接这些对象吗?
发布于 2009-09-15 09:41:59
在回答您的问题时,它不会复制。
它创建一个枚举数并遍历集合。如果在此枚举发生时,在foreach本身中或异步地更改了集合,您将得到一个异常:
mscorlib.dll中出现'System.InvalidOperationException‘类型的未经处理的异常
附加信息:集合已修改;枚举操作可能无法执行。
您可以使用临时集合并在以后连接这两个集合,也可以不使用枚举器。
for (int i = 0; i < pages.Count; i++)
{
test.AddRange(RetrieveSubPages(pages[i].Id));
}发布于 2009-09-15 08:47:24
看起来代码并没有修改Pages集合,而是修改了Pages集合中Page对象中对象的内容。至少具有类似集合的方法的Page类型。
一般来说,每个集合都以适合自己的方式实现迭代,并且在迭代时通常是不可修改的,但可以通过获取自身的快照来实现迭代的集合。
没有检测循环退出的机制,这将允许在该点采取操作(考虑这将如何与循环主体中的异常、中断和返回进行交互)。
发布于 2009-09-15 08:46:55
在大多数情况下,foreach针对实时集合(无显式克隆)工作,如果您在枚举集合时尝试更改集合,则枚举器会中断并引发异常。因此,如果您要添加到Pages中,请预料到会出现问题。
https://stackoverflow.com/questions/1425932
复制相似问题