注意:这已经可以正常工作,但我试图理解为什么它以这种方式工作,而不是另一种方式.
我有一个动态放置图像的WinForm(C#),如下所示:
现在,如果您单击"Napred"按钮,应删除这些图像(以及其他内容),我最初使用这些图像:
foreach(Control ctrl in Controls) if(ctrl is PictureBox) ctrl.Dispose();
要么
for(int i = 0; i < Controls.Count; i++) if(Controls[i] is PictureBox) Controls[i].Dispose();
现在如果我运行这个,我得到:
但是,如果我只是将for
声明改为向后发送,那么它有效吗?
for(int i = Controls.Count - 1; i >= 0; i--) if(Controls[i] is PictureBox) Controls[i].Dispose();
(我不会上传另一张图片,但会删除所有元素(我只留下最后的按钮))
有人可以告诉我为什么一个有效,而不是另一个有效吗?
编辑:我在Windows 10上使用VS2015社区版,如果这是一个调试错误(?)
您正在尝试更改正在迭代的列表,这当然会更改此列表的索引,因此索引1处的索引现在位于索引0处.
通过从数组的末尾删除(即反向),先前的索引将始终相同.
正如Matthew Watson的评论中所述,这一点也很重要:
Control.Dispose()是特殊的,将从父容器的Controls列表中删除控件.
这不是大多数Dispose方法的默认行为,因此在使用时不会总是发现此行为 Dispose