当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《代码混淆-为什么一个工作,而另一个工作?》经验,为你挑选了1个好方法。

注意:这已经可以正常工作,但我试图理解为什么它以这种方式工作,而不是另一种方式.

我有一个动态放置图像的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> Sayse..:

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

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

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

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

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


我认为你应该清楚他是如何改变他正在迭代的列表,因为只是检查代码他没有直接从列表中删除项目.答案是`Control.Dispose()`是特殊的,它将从父容器的`Controls`列表中删除控件.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有