释放自定义对象
本文关键字:对象 自定义 释放 | 更新日期: 2023-09-27 18:31:51
是否需要释放自定义对象,即使它们只包含托管对象?例如,我有一个自定义类,其中包含一些 List 对象,以及一些字符串和 xmldocument 类型。我是否应该创建自己的Dispose方法(同时不从IDisposable继承)并清除它们以确保它们是空的?如果我应该,我是否也应该从 IDisposable 继承?
仅当一个或多个托管对象继承自 IDisposable 时。
如果您有 IDisposable 对象(也称为托管资源),则实现 IDisposable,但不添加析构函数/终结器。
根据经验,如果您引用的任何托管对象实例实现IDisposable
,则应实现IDisposable
。然后,您可以在Dispose
实现中释放它们。
您
会看到,在对象的生存期结束时设置对null
的引用不会更改垃圾回收器的任何内容。如果对所包含对象的唯一剩余引用来自自定义对象,则垃圾回收器无论如何都会将它们视为符合垃圾回收条件(因为它仅查找来自活动对象的引用)。如果有来自其他位置的引用,则不会收集包含的对象,无论您是否清理引用。
当然,另一个故事是,当你包含的一些对象需要显式处置时,即实现IDisposable
,或者需要在生命周期结束时关闭(尽管正确的方法是无论如何实现IDisposable
)等等。这样,您可能需要自己实现IDisposable
,并在Dispose
中释放包含的对象。
当然,当您引用非托管对象时,您需要以特殊的方式实现IDisposable
,但这是另一回事。