在处置时清除托管资源
可能重复:
任何意义在Dispose()中设置obj = null(Nothing)?
我理解这个问题是否作为重复被关闭,但我在协调关于此主题的一些帖子时遇到了一些麻烦。
首先有一点背景。 我有一个类Foo如下
public class Foo : IDisposable
{
private Dictionary<int, string> _reallyBigDictionary =
new Dictionary<int, string>();
public void Dispose()
{
_reallyBigDictionary = null;
}
}
众所周知,Foo的实例的范围是有限的(即我知道我们不会永远保持它)。 鉴于它是实例的有限范围,我没有看到_reallyBigDictionary实际上是如何将配置空间释放的更快。 按照我的理解,这些对象在垃圾收集运行之前不会被清理干净。 那时,对Foo给定实例的引用无论如何都是空的,所以我希望GC不管收回那个内存。
这些帖子让我相信将成员变量设置为null是没有意义的:
内存泄漏问题:处置还是不处置管理资源?
销毁所有对象还是让垃圾收集器完成这项工作更好?
这篇文章让我不以为然:正确使用IDisposable接口
任何人都可以为我澄清这一点吗? IDisposable的实现在这里真的需要吗? 因为我无法说服自己。
你不需要IDisposable
; 这是为什么。 总之,您需要遵循规则1:除非需要,否则不要实施IDisposable
。
当需要实现IDisposable
时,只有两种情况:
IDisposable
)资源。 由于Dictionary<int, string>
不是IDisposable
,所以你的类不应该是。
通过实现IDisposable
接口,您可以使用Using
语句来限定资源的Using
范围。 另外,.NET Framework中的许多类都会检测到某个类是IDisposable,并为您运行Dispose()
,从而免除了您负责管理的子对象的责任。
编辑----
由于评论和减价,我认为Id增加了我的答案:
.NET Framework中的许多类都实现了IDisposable - 例如许多通用集合类型。 当您处理这样的集合时,Microsoft实现将调用您的类的Dispose方法,并检测到它实现了IDisposable。 此外,还有一种情况是将一个对象的引用设置为null,包括可能在您的Dispose方法中。 如果要删除对象的引用,请将引用设置为null。 其他类可能需要维护对同一对象的引用,所以将参数设置为null的参数是错误的“是一个有缺陷的论证。 使用Dispose方法将引用设置为null与以任何其他方式将其设置为null没有什么不同 - 但是通过在您的IDisposable实现中执行此操作,您可以采用更确定且防错的方法来确保发生此情况。 实现IDisposable也是实现范围界定的一种很好的方式,例如用于事务性算法等。实现IDisposable在很多方面都是有用的,并且需要避免,只要你知道它是如何工作的以及为什么工作的。 它总是令我惊奇的是,很少有.NET开发人员真正理解IDisposable接口,Finalizers,垃圾收集器和.NET最佳实践
在这种情况下,我认为不需要处置。 这不像它是一个活跃的连接,将保持开放并继续使用资源。 当你使用它时,它会自行管理。
如果您确实想确保这段代码没有内存泄漏,您可以尝试将以下内容添加到dispose方法中:
GC.Collect();
链接地址: http://www.djcxy.com/p/9235.html
上一篇: Nulling Out Managed Resources on Dispose
下一篇: Writing our own Dispose method instead of using Idisposable