是否有必要处置自定义对象,即使它们只包含托管对象?例如,我有一个包含一些List对象的自定义类,以及一些字符串和xmldocument类型。我应该创建自己的Dispose方法(不继承IDisposable)并清除它们以确保它们是空的吗?如果我应该,我还应该继承IDisposable吗?
答案 0 :(得分:6)
仅当一个或多个托管对象继承自IDisposable时。
如果你有IDisposable对象(也就是托管资源),那么实现IDisposable但是不添加析构函数/终结器。
答案 1 :(得分:2)
根据经验,如果您引用的任何托管对象实例都实现IDisposable
,则应实现IDisposable
。然后,您可以在Dispose
实施中处置这些内容。
答案 2 :(得分:0)
您可以看到,在对象生命周期结束时设置对null
的引用不会改变垃圾收集器的任何内容。如果对包含的对象的唯一剩余引用来自您的自定义对象,则垃圾收集器无论如何都将它们视为有资格进行垃圾收集(因为它仅查找来自活动对象的引用)。如果有来自其他地方的引用,则无论您是否清理引用,都不会收集包含的对象。
当然,另一个故事是,当某些包含的对象需要明确处理时,即实现IDisposable
,或者需要在生命周期结束时关闭(尽管无论如何都要采用正确的方法) IDisposable
)等。这样您可能需要自己实施IDisposable
,并在Dispose
中处置所包含的对象。
当然,当您引用非托管对象时,需要以特殊方式实现IDisposable
,但这是another story。