con*_*att 12 .net c# enumeration
我正在枚举一个实现IList的集合,在枚举过程中我正在修改集合.我收到错误,"收集被修改;枚举操作可能无法执行."
我想知道为什么在迭代期间修改集合中的项时会发生此错误.我已经将foreach循环转换为for循环,但我想知道发生此错误的原因的'详细信息'.
cdh*_*wie 17
只要集合保持不变,枚举器仍然有效.如果对集合进行了更改(例如添加,修改或删除元素),则枚举数将无法恢复,并且其行为未定义.
我相信这个决定的原因是不能保证所有类型的集合都能够维持修改并仍然保留枚举器状态.考虑链接列表 - 如果删除节点并且当前节点上的枚举器位于该节点上,则节点引用可能是其唯一的状态.删除该节点后,"下一个节点"引用将被设置为null,有效地使枚举器状态无效并阻止进一步枚举.
由于某些集合实现在这种情况下会遇到严重问题,因此决定将此部分与IEnumerable接口合同.在某些情况下允许修改而不是在其他情况下进行修改会非常令人困惑.此外,这意味着在更改集合实现时,可能依赖于在枚举集合时修改集合的现有代码会出现严重问题.因此,优化所有可用内容的行为是一致的.
Dre*_*kes 10
在内部,大多数基本集合类都维护版本号.无论何时添加,删除,重新排序等集合,此版本号都会递增.
当您开始枚举时,将获取版本号的快照.每次循环时,都会将此版本号与集合进行比较,如果它们不同,则抛出此异常.
虽然有可能实现IList,使其能够正确地改变以搜集处理中的foreach循环(由具有枚举跟踪收集的变化),这是一个非常困难的任务是用通过向集合所做的更改正确对待枚举期间的其他线程.因此,存在此异常有助于识别代码中的漏洞,并提供某种关于其他线程操作带来的潜在不稳定性的早期警告.