WinForms并处理自定义控件

时间:2012-05-17 11:05:17

标签: c# .net winforms controls dispose

我有以下课程:

public class NewListBox : ListBox
    {
        public NewListBox()
        {
        }

        private ImageList _myImageList;

        public ImageList ImageList
        {
            get { return _myImageList; }
            set { _myImageList = value; }
        }
     }

我感兴趣的是处理这个对象是否会触发对象上的字段的处理,比如ImageList,还是应该实现(覆盖)Dispose方法并自己完成这项工作?

4 个答案:

答案 0 :(得分:5)

您应该将ImageList添加到控件的Components集合中,然后Dispose的基类实现将Dispose在该集合中的所有内容,并且您不必重置Dispose自己。

如果您有任何IDisposable成员但不是Components,那么您必须在控件中覆盖Dispose并自行处理它们。

(严格意义上说,我使用的是从System.ComponentModel.Component派生的对象中的Component。)

答案 1 :(得分:5)

这个article非常有用,在Memory Disposal部分。

所有实现IDisposable的类(包括所有Windows窗体控件)都有一个Dispose方法。当不再需要对象以释放除内存之外的资源时,必须调用此方法。这有两种方式:

  • 手动(通过显式调用Dispose)
  • 自动:通过将对象添加到.NET容器,例如Form,Panel,TabPage或 用户控件。容器将确保在处理时,其所有成员也是如此。当然,容器本身必须处理(或者又是另一个容器的一部分)。 对于Windows窗体控件,我们几乎总是将它们添加到容器中 - 因此依赖于自动处理。

答案 2 :(得分:1)

这里有很多不同的答案..

我强烈建议您阅读Garbage Collector Basics and Performance Hints 在你的情况下,你有两个选择:

  • 手动处理ImageList,因此将释放资源 快速(但不是立即)
  • 什么都不做:下次垃圾时会释放资源 收集器分析您组建的生成。如果你的形式是 关闭,没有任何内容可以引用您的表单,然后是您的表单 将被处置,然后因为没有参考将指向 ImageList将被处理掉。资源 将被释放,但比第一种情况晚一点。

除非你的ImageList中有数千个大图像(或者如果你创建/关闭表单数百次),你将不会注意到2个案例之间的任何差异

答案 3 :(得分:0)

根据您发布的代码,您没有使用Designer来实现此控件。因此,您不会有设计师提供的Dispose(bool disposing)方法或System.CompononetModel.IContainer components成员,您可以添加额外的控件。我不确定ListBox如何处理其Controls属性,但如果它允许您使用ImageList注册Controls.Add(ImageList)实例,则应该会自动Dispose()行为。< / p>

您的其他选择是覆盖Control.Dispose(bool),如下所示:

protected override void Dispose(bool disposing)
{
    // Only call Dispose() on members if invoked through a direct
    // call to `Dispose()`. (If disposing is false, that means
    // we are invoked through the finalizer and we should *only*
    // free up unmanaged resources that we *directly* own).
    if (disposing)
    {
        ImageList.Dispose();
    }

    base.Dispose(disposing);
}