WinForms和处置自定义控件(WinForms and disposing custom con

2019-07-29 10:53发布

我有以下类:

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

        private ImageList _myImageList;

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

我感兴趣的此对象是否处置将触发处置对象的字段,如将ImageList的,或者我应该实现(覆盖)Dispose方法和做好这项工作自己?

Answer 1:

你应该将ImageList添加到您控制的组件集合,然后处置的基类实现将配置该集合中的一切,你将不必重写处置自己。

如果你是IDisposable的,但都没有任何组件的成员,那么你将不得不重写处置在你的控制和处置自己的他们。

(我正在使用对象的严格意义上的自System.ComponentModel.Component得出短期部分)。



Answer 2:

此文章是非常有帮助的,在内存配置部分。

实现IDisposable的所有类(包括所有Windows窗体控件)有一个Dispose方法。 当以释放其他的资源比存储器不再需要的对象必须被调用此方法。 有两种方式出现这种情况:

  • 手动(由调用Dispose明确地)
  • 自动:通过将对象到.NET容器,如一种形式,面板,TabPage的或用户控件。 容器将确保当它的配置,等等都是它的成员。 当然,容器本身必须被设置(或反过来,是另一容器的一部分)。 在Windows的情况下窗体控件,我们几乎总是将它们添加到一个容器 - 并因此依赖于自动处理。


Answer 3:

这里不同的答案很多..

我强烈建议阅读垃圾收集基础知识和性能提示在你的情况下您将两个选项:

  • 手动配置ImageList中,所以的ressource将迅速(立即但不是)被释放
  • 什么都不做:资源将被释放下一次垃圾收集分析,您的形式是代。 如果您的形式是封闭的,并没有什么保留引用到您的表单,那么你的表格将被安置,然后因为没有参考将指向到ImageList了,将ImageList将被布置。 这些资源将被释放,但有点晚于第一种情况。

除非你有大的图像千元在你的ImageList(或者,如果你创建/关闭窗体次百),你会不会注意到2例有什么区别



Answer 4:

基于你已经发布的代码,你不使用设计器来实现这种控制。 因此,你不会有一个设计师提供Dispose(bool disposing)方法或System.CompononetModel.IContainer components ,你额外的控制可能会被添加到成员。 我不知道ListBox中如何处理其Controls的财产,但如果它让你注册ImageList与有实例Controls.Add(ImageList) ,应该让你自动Dispose()行为。

您的另一种选择是覆盖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);
}


文章来源: WinForms and disposing custom controls