代码混乱 - 为什么一个有效,而另一个无效?
Code confusion - why does one work, but not the other?
注意:这已经可以正常工作了,但我试图理解为什么它以这种方式工作,而不是其他方式。
我有一个带有动态放置图像的 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() is special and will remove the control from a parent container's Controls list.
这不是大多数 Dispose 方法的默认行为,因此您在使用 Dispose
时不会总是发现这种行为
注意:这已经可以正常工作了,但我试图理解为什么它以这种方式工作,而不是其他方式。
我有一个带有动态放置图像的 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() is special and will remove the control from a parent container's Controls list.
这不是大多数 Dispose 方法的默认行为,因此您在使用 Dispose