2011-02-03 53 views
-1

从我的理解的接口资源被释放,一旦引用计数的接口上获取到0我需要在.NET中释放私人界面字段吗?

考虑以下私有字段:

private IMyInterface _field = new DisposableObject() 

我是否需要明确的仍然自由这个领域了在类例如让班级执行IDisposable并将其释放到Dispose?或者它会自动释放,因为我正在使用一个接口?

我在Delphi中有类似的情况,它导致了一个内存泄漏,让我有点困惑,因为我一直认为接口对象不需要被释放(因为它们是引用计数)。为了修复内存泄漏,我必须存储混凝土类型并将其释放。

我想我真的得到的是为什么我需要释放它,如果我使用的接口?

回答

1

.NET不使用引用计数来确定何时资源被垃圾收集。当程序中任何位置没有对象时,将收集对象。这是通过对象图遍历而不是引用计数完成的,因此循环引用不会泄漏资源。

如果具有非托管资源的类编码正确,则对Dispose的调用将是可选的。无论何时发生垃圾收集,资源都将在终结器中清除。

Dispose不影响对象的生命周期。在没有对剩余对象的实时引用之后,它会在某个时间收集垃圾。

对象的生命周期也不受引用它的变量是接口还是对象类型的影响。将变量设置为null将删除活动引用,如果没有其他对象的引用,则允许收集对象。

+0

+1 - 这几乎是我正在寻找的解释。在Delphi中,如果我在正常情况下使用接口来引用资源,我不需要明确地释放它。 – James 2011-02-03 15:01:39

1

当您的课程包含一次性字段,由您的课程管理 - 我的意思是,它们在您的课程内部进行了授课 - 然后您的课程也应实施IDisposable接口。

如果您不再需要处置一次性物品,您不确定何时物品将被丢弃。

3

我想我真的得到的是为什么我需要释放它,如果我使用的接口?

接口只告诉你如何正确处理资源,不做到这一点。你必须自己决定。

一个好的经验法则是,谁最初请求资源的人也负责处置它。如果您的对象拥有该资源,那么它应该在资源本身处置时(或更早,如果它不再需要该资源)处置资源。如果它不拥有资源,但只是使用它,那么它通常不应该处理它。

+0

+1很好的解释。 – James 2011-02-03 14:55:22

0

使用接口并不意味着您不需要应用正确的处理技术。

0

是的,你应该实现IDisposable(如何做到这一点取决于你的班级,看看here的一些很好的建议)。

接口与否,您创建了该对象,因此您(通常)负责清理它。既然它是一次性的,那就是要走的路。

由于垃圾收集,传统意义上的内存泄漏几乎是不可能的,但一次性对象通常会处理其他资源(如文件,数据库连接,COM对象或其他),因此资源泄漏仍是可能的。