C# 代码混乱-为什么一个有效,而另一个无效?

C# 代码混乱-为什么一个有效,而另一个无效?,c#,winforms,for-loop,picturebox,C#,Winforms,For Loop,Picturebox,注意:这已经很好了,但我试图理解为什么它是这样工作的,而不是另一种 我有一个WinForm(C#),带有动态放置的图像,如下所示: 现在,如果单击“Napred”按钮,这些图像应被删除(除其他外),我最初使用这些图像: foreach(Control ctrl in Controls) if(ctrl is PictureBox) ctrl.Dispose(); 或 (我不打算上传另一张图片,但它会删除所有元素(最后我只剩下按钮)) 有人能告诉我为什么一个有效,而另一个无效 for(

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

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

现在,如果单击“Napred”按钮,这些图像应被删除(除其他外),我最初使用这些图像:

foreach(Control ctrl in Controls)
    if(ctrl is PictureBox) ctrl.Dispose();

(我不打算上传另一张图片,但它会删除所有元素(最后我只剩下按钮))

有人能告诉我为什么一个有效,而另一个无效

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

编辑:如果是调试错误(?)

我正在Windows 10上使用VS2015 community edition,您试图更改正在迭代的列表,这当然会更改此列表的索引,因此索引1处的内容现在位于索引0处

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

正如Matthew Watson的评论中所述,值得注意的还有:

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


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

时,您不会总是发现这种行为。如果您有一个包含10个项目的数组,然后删除项目1,那么项目2将成为新的项目1,您将有9个剩余项目。处理数组项的标准方法是一步一步地进行。其他方法可能会感兴趣:为什么不使用Remove方法?@SergiiZhevzhyk我使用了,结果基本相同,但我已经阅读了其他内容,因此Remove()无法正确处理元素(内存方面)“这是一个更好的解决方案。”NemanjaT我完全同意所有资源都应该得到适当的配置。我可能会从收藏中删除图片,然后进行处理。我理解,这就是为什么每第二个元素都会被删除的原因。谢谢你把这件事弄清楚!我一点也没想到!我认为您应该清楚他是如何更改他正在迭代的列表的,因为仅仅通过检查代码,他并没有直接从列表中删除项。答案是
Control.Dispose()
是特殊的,它将从父容器的
Controls
列表中删除该控件。@MatthewWatson-非常正确,我试图在引用列表时保留此泛型,但通常可以这样迭代,按顺序处理列表中的项,因为它不会改变列表中项目的索引。迭代的是
控件
属性,这与此极为相关。仅对列表中的项目调用
Dispose()
,通常不会改变列表本身。@MatthewWatson-我现在在回答中包含了您的部分评论,我试图在msdn或developersource中找到对此的正确引用,但未能找到。希望这是好的!
for(int i = Controls.Count - 1; i >= 0; i--)
    if(Controls[i] is PictureBox) Controls[i].Dispose();