C# 如何清除()控件而不导致内存泄漏

C# 如何清除()控件而不导致内存泄漏,c#,winforms,memory-leaks,C#,Winforms,Memory Leaks,阅读Control.Clear()之后导致内存泄漏(在验证),我想知道是否: while (Controls.Count > 0) Controls[0].Dispose(); 就足够了,还是必须递归遍历控件中的所有控件 另外,是否有任何理由执行Control.Clear()之后?(我看到有人在某处说) 谢谢。发布的代码片段是正确的。不需要Clear(),Control.Dispose()方法已将控件从控件集合中移除。这就是它起作用的原因 回路的报警程度较低的版本为: for (int

阅读
Control.Clear()之后导致内存泄漏(在验证),我想知道是否:

while (Controls.Count > 0) Controls[0].Dispose();
就足够了,还是必须递归遍历控件中的所有控件

另外,是否有任何理由执行
Control.Clear()之后?(我看到有人在某处说)


谢谢。

发布的代码片段是正确的。不需要Clear(),Control.Dispose()方法已将控件从控件集合中移除。这就是它起作用的原因

回路的报警程度较低的版本为:

 for (int ix = Controls.Count-1; ix >= 0; --ix) Controls[ix].Dispose();

无需遍历控件的子项并对其进行处理,这已经自动发生。

您的代码将无限循环。@s单击“否”。在每次
dispose()
之后,原来的
Controls[1]
将变为
Controls[0]
。技术上不需要,因为dispose不会删除实际对象,只是释放它的资源,正如我在回答中所说的,在调用dispose之后,您必须显式删除引用。@YetAnotherGeek“技术上不”–您的意思是什么?@ispiro他的意思是调用dispose不会从集合中删除元素。呵呵,否决。有些人似乎对198k的支持没有太多的评价:)这可能来自Hmya,但人们对它的了解甚少。这就是为什么你想使用“不那么令人担忧的版本”,尽管有人对它投了反对票。