释放自定义对象

本文关键字:对象 自定义 释放 | 更新日期: 2023-09-27 18:31:51

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

释放自定义对象

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

如果您有 IDisposable 对象(也称为托管资源),则实现 IDisposable,但不添加析构函数/终结器。

根据经验,如果您引用的任何托管对象实例实现IDisposable,则应实现IDisposable。然后,您可以在Dispose实现中释放它们。

会看到,在对象的生存期结束时设置对null的引用不会更改垃圾回收器的任何内容。如果对所包含对象的唯一剩余引用来自自定义对象,则垃圾回收器无论如何都会将它们视为符合垃圾回收条件(因为它仅查找来自活动对象的引用)。如果有来自其他位置的引用,则不会收集包含的对象,无论您是否清理引用。

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

当然,当您引用非托管对象时,您需要以特殊的方式实现IDisposable,但这是另一回事。