继这个问题用于处理跳过迭代的控件的 Foreach 循环 https://stackoverflow.com/questions/35083873/foreach-loop-for-disposing-controls-skiping-iterations/35084043#35083991让我烦恼的是,允许对不断变化的集合进行迭代:
例如,以下内容:
List<Control> items = new List<Control>
{
new TextBox {Text = "A", Top = 10},
new TextBox {Text = "B", Top = 20},
new TextBox {Text = "C", Top = 30},
new TextBox {Text = "D", Top = 40},
};
foreach (var item in items)
{
items.Remove(item);
}
throws
InvalidOperationException:集合已修改;枚举操作可能无法执行。
但是,在 .Net 表单中,您可以执行以下操作:
this.Controls.Add(new TextBox {Text = "A", Top = 10});
this.Controls.Add(new TextBox {Text = "B", Top = 30});
this.Controls.Add(new TextBox {Text = "C", Top = 50});
this.Controls.Add(new TextBox {Text = "D", Top = 70});
foreach (Control control in this.Controls)
{
control.Dispose();
}
它会跳过元素,因为迭代器在不断变化的集合上运行,不抛出异常
漏洞?迭代器不需要抛出InvalidOperationException
如果底层集合发生变化?
所以我的问题是为什么要对变化的迭代ControlCollection
不抛出InvalidOperationException?
附录:
The 的文档IEnumerator https://learn.microsoft.com/dotnet/api/system.collections.ienumerator says:
枚举器没有对集合的独占访问权;因此,通过集合进行枚举本质上不是线程安全的过程。即使集合被同步,其他线程仍然可以修改该集合,这会导致枚举器抛出异常.