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

本文关键字:释放 控件 创建 动态 | 更新日期: 2023-09-27 18:33:46

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

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

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

flowPanel.Controls.Remove(thePanelToRemove);

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

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

或类似?

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

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

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

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

是的,当对象超出范围时,它有资格进行垃圾回收。您无需调用任何 .免费方法。

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

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

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

更多的垃圾回收。