【发布时间】:2023-03-17 06:45:01
【问题描述】:
注意:这已经可以正常工作了,但我正在尝试理解为什么它会以这种方式工作,而不是另一种。
我有一个带有动态放置图像的 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 社区版(?)
【问题讨论】:
-
如果您有一个包含 10 个项目的数组,然后删除 Item1,Item2 将成为新的 Item1,您将剩下 9 个项目。处理数组项的标准方法是向后逐步处理。
-
可能对其他方法感兴趣:stackoverflow.com/questions/7340757/…
-
为什么不用Remove方法?
-
@SergiiZhevzhyk 我做了,几乎相同的结果,但我在其他地方读到 Remove() 没有正确处理元素(内存方面),这是一个更好的解决方案。
-
@NemanjaT 我完全同意所有资源都应该妥善处理。我可能会从收藏中删除图片,然后将其丢弃。
标签: c# winforms for-loop picturebox