处置自定义对象

时间:2012-04-20 15:59:57

标签: c# garbage-collection idisposable

是否有必要处置自定义对象,即使它们只包含托管对象?例如,我有一个包含一些List对象的自定义类,以及一些字符串和xmldocument类型。我应该创建自己的Dispose方法(不继承IDisposable)并清除它们以确保它们是空的吗?如果我应该,我还应该继承IDisposable吗?

3 个答案:

答案 0 :(得分:6)

仅当一个或多个托管对象继承自IDisposable时。

如果你有IDisposable对象(也就是托管资源),那么实现IDisposable但是添加析构函数/终结器。

答案 1 :(得分:2)

根据经验,如果您引用的任何托管对象实例都实现IDisposable,则应实现IDisposable。然后,您可以在Dispose实施中处置这些内容。

答案 2 :(得分:0)

您可以看到,在对象生命周期结束时设置对null的引用不会改变垃圾收集器的任何内容。如果对包含的对象的唯一剩余引用来自您的自定义对象,则垃圾收集器无论如何都将它们视为有资格进行垃圾收集(因为它仅查找来自活动对象的引用)。如果有来自其他地方的引用,则无论您是否清理引用,都不会收集包含的对象。

当然,另一个故事是,当某些包含的对象需要明确处理时,即实现IDisposable,或者需要在生命周期结束时关闭(尽管无论如何都要采用正确的方法) IDisposable)等。这样您可能需要自己实施IDisposable,并在Dispose中处置所包含的对象。

当然,当您引用非托管对象时,需要以特殊方式实现IDisposable,但这是another story

相关问题