如何将列表项设置为null C#?

时间:2012-05-07 10:45:22

标签: c# memory-leaks dispose

我有一个名为container的用户控件,我在运行时添加其他用户控件。

我想从容器中删除所有控件,我正在执行container.Controls.Clear()但是我的控件仍在内存中,如何将它们设为null?

3 个答案:

答案 0 :(得分:8)

调用Clear方法不会从内存中删除控制句柄。您必须显式调用Dispose方法以避免内存泄漏。

了解详情:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx

答案 1 :(得分:4)

假设面板是包含所有子控件的父控件,因此遍历所有子控件并调用每个可能解决问题的处理方法

  while (panel.Controls.Count > 0)
  {
     panel.Controls[0].Dispose();
  } 

调用clear方法只是从容器控件中删除控件而不是从内存中移除控件,所以你需要处理它们......

答案 2 :(得分:1)

在父容器上调用Dispose()也将处置其所有子控件,假设它们也实现IDisposable。一般来说,所有WinForms控件都将实现IDisposable,因此这应该可行。

如果它们不这样(因为WPF控件不会隐式使用非托管代码,因此WPF的情况),您需要向控件添加一些自定义清理方法。最常见的内存泄漏源之一是未分离的事件处理程序。我通常会做以下事情:

public void CleanUp()
{
    //detach event handlers
    //other cleanup as necessary
}

如果您将此虚拟化并将其添加到用户控件将继承的基类,这将特别有用,因此您只需调用CleanUp()而无需检查类型。我个人喜欢这种方法,而不是实现IDisposable,因为IDisposable主要用于清理非托管资源。