我有以下课程:
public class NewListBox : ListBox
{
public NewListBox()
{
}
private ImageList _myImageList;
public ImageList ImageList
{
get { return _myImageList; }
set { _myImageList = value; }
}
}
我感兴趣的是处理这个对象是否会触发对象上的字段的处理,比如ImageList,还是应该实现(覆盖)Dispose方法并自己完成这项工作?
答案 0 :(得分:5)
您应该将ImageList添加到控件的Components集合中,然后Dispose的基类实现将Dispose在该集合中的所有内容,并且您不必重置Dispose自己。
如果您有任何IDisposable成员但不是Components,那么您必须在控件中覆盖Dispose并自行处理它们。
(严格意义上说,我使用的是从System.ComponentModel.Component派生的对象中的Component。)
答案 1 :(得分:5)
这个article非常有用,在Memory Disposal部分。
所有实现IDisposable的类(包括所有Windows窗体控件)都有一个Dispose方法。当不再需要对象以释放除内存之外的资源时,必须调用此方法。这有两种方式:
答案 2 :(得分:1)
这里有很多不同的答案..
我强烈建议您阅读Garbage Collector Basics and Performance Hints 在你的情况下,你有两个选择:
除非你的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);
}