代码混淆 - 为什么一个工作,而另一个工作?

时间:2015-12-03 09:17:28

标签: c# winforms for-loop picturebox

注意:这已经很好了,但是我试图理解为什么它会这样运作,而不是另一种。

我有一个动态放置图像的WinForm(C#),如下所示: enter image description here

现在,如果您点击“删除”'按钮,这些图像应该删除(除其他外),我最初使用的是:

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();

现在如果我运行这个,我得到:

enter image description here

但如果我只是更改for语句以向后发送,有效

for(int i = Controls.Count - 1; i >= 0; i--)
    if(Controls[i] is PictureBox) Controls[i].Dispose();

(我不会上传其他图片,但会删除所有元素(我只留下最后留下的按钮))

有人可以告诉我为什么一个有效,但不是另一个

编辑:我在Windows 10上使用VS2015社区版是否存在调试错误(?)

1 个答案:

答案 0 :(得分:12)

您正在尝试更改您正在迭代的列表,这当然会更改此列表的索引,因此索引1处的索引现在位于索引0处。

通过从数组末尾删除(即反向),以前的索引将始终相同。

如Matthew Watson的评论中所述,这一点也很重要:

  

Control.Dispose()是特殊的,它将从父容器的控件列表中删除控件。

大多数Dispose方法都不是默认行为,因此在使用Dispose

时,您不会总是发现此行为