1

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

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

在我的情况下(WinForms),我动态地填充了一个带有面板的 flowLayoutPanel,其中包含一些其他控件。在某些情况下,我需要移除一些面板。我正在做的事情是

flowPanel.Controls.Remove(thePanelToRemove);

这具有所需的效果:面板从 flowLayoutPanel 中消失,但我没有得到的是:垃圾收集器是否删除了控件?这将是理想的行为,因为我将创建许多控件,当用户删除它们时将不再使用它们。如果没有,我如何确定控件被释放?类似的东西(伪代码)

flowPanel.Controls.Remove(thePanelToRemove);
thePanelToRemove.Free();

或类似的?

4

3 回答 3

2

简短的回答:是的,垃圾收集器会在需要内存时移除控制。

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

于 2012-05-11T06:38:59.517 回答
1

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

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

于 2012-05-11T06:37:10.563 回答
1

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

当然,控件引用的任何非托管资源都应该被适当地释放和/或处置。非托管资源可以是文件流、数据库连接、对分配给图像处理的非托管字节数组的引用、从 Win32 API 获得的窗口句柄等。

.Net 中的垃圾收集概述(旧文章,但看起来仍然准确,除了c# 4.0 的 GC 更改)。

更多垃圾收集

于 2012-05-11T06:37:18.347 回答