在C#中动态创建和释放控件

时间:2012-05-11 06:35:26

标签: c# .net winforms

作为.NET领域的新手,来自Delphi背景,我习惯于动态创建控件并在需要时手动释放它们。

在.net中,被垃圾收集等等,我猜你不需要明确释放控件。

在我的情况下(WinForms),我使用面板动态填充flowLayoutPanel,其中包含一些其他控件。在某些情况下,我需要删除一些面板。我正在做的是

flowPanel.Controls.Remove(thePanelToRemove);

这有必要的效果:面板从flowLayoutPanel中消失,但我得不到的是:垃圾收集器是否删除了控件?这将是期望的行为,因为我将创建许多控件,当用户删除它们时将不再使用它们。如果没有,我怎么能确定控件被释放?像(伪代码)

的东西
flowPanel.Controls.Remove(thePanelToRemove);
thePanelToRemove.Free();

或类似的?

3 个答案:

答案 0 :(得分:2)

简答:是的,当需要内存时,垃圾收集器将删除控件。

更长的答案:某些控件声称垃圾收集器无法释放资源。这些控件实现了IDisposable接口,当你不再需要它时,你应该在控件上调用dispose。 Dispose将清理这些非托管资源。

答案 1 :(得分:1)

  

这具有所需的效果:面板从中消失   flowLayoutPanel,但我没有得到的是:垃圾收集器   删除控件?

是的,当一个对象超出范围时,它有资格进行垃圾收集。你不需要调用任何.Free方法。

答案 2 :(得分:1)

假设控件没有被其他东西引用,它的引用计数将在删除时降至零,并且将按预期进行垃圾收集。这是一个简化的描述(如果您想了解更多内容,请参阅下面的链接),但作为完全托管资源的一般规则,您很少需要担心确定性处置和最终确定。

当然,控件引用的任何非托管资源都应该正确发布和/或处理。非托管资源可以是文件流,数据库连接,对分配用于图像处理的非托管字节数组的引用,从Win32 API获取的窗口句柄等。

garbage collection in .Net概述(旧文章但仍显示准确,GC changes for c# 4.0除外)。

更多garbage collection