【问题标题】:How to set list items to null C#?如何将列表项设置为空 C#?
【发布时间】:2012-05-07 10:45:22
【问题描述】:

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

我想从容器中删除所有控件,我正在做container.Controls.Clear() 但我的控件仍在内存中,我怎样才能使它们为空?

【问题讨论】:

    标签: c# memory-leaks dispose


    【解决方案1】:

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

    阅读更多:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx

    【讨论】:

      【解决方案2】:

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

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

      调用 clear 方法只是从容器控件而不是内存中删除您的控件,因此您需要处理它们...

      【讨论】:

        【解决方案3】:

        在父容器上调用Dispose() 也会释放其所有子控件,假设它们也实现了IDisposable。一般来说,所有的 WinForms 控件都会实现 IDisposable 所以这应该可以工作。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-04
          • 2017-09-11
          • 1970-01-01
          • 1970-01-01
          • 2021-03-16
          • 2019-10-29
          • 2018-12-19
          相关资源
          最近更新 更多