WinForms并处理自定义控件

lys*_*cid 4 .net c# controls dispose winforms

我有以下课程:

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

        private ImageList _myImageList;

        public ImageList ImageList
        {
            get { return _myImageList; }
            set { _myImageList = value; }
        }
     }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*tin 5

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

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

(我严格意义上使用从System.ComponentModel.Component派生的对象中的Component一词).

  • WinForms控件是否有任何一致的模式来获取IDisposable属性的所有权,哪些不具有?我的理解是,使用类似于`Image`属性(控件通常不拥有)的东西,将控件的`Image`属性设置为在该控件之外无需任何目的所需的图片的代码也应附加自身对于那个控件的`Disposed`事件,当控件是'Dispose`d时``Dispose`图像,但并非所有属性都是这样工作的.`Font`属性看起来很奇怪...... (2认同)
  • ...因为将控件的'Font`属性设置为已经处置的字体,控件不会介意.我不知道这是好还是坏,但似乎有效. (2认同)

hjg*_*aca 5

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

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

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