我是否需要在.NET中释放私有接口字段?

时间:2011-02-03 14:46:36

标签: .net memory-management interface memory-leaks

根据我的理解,一旦接口上的引用计数变为0,就会释放接口资源。

考虑以下私人领域:

private IMyInterface _field = new DisposableObject()

我是否还需要在课程中明确地释放此字段,例如让课程实施IDisposable并在Dispose上免费提供?或者它会自动释放,因为我使用的是界面?

我在Delphi中有类似的情况,它导致内存泄漏让我感到困惑,因为我一直以为接口对象不需要被释放(因为它们被引用计数)。为了解决内存泄漏问题,我不得不存储具体类型并将其释放出去。

我想我真正得到的是为什么如果我使用界面,我是否需要将其释放?

5 个答案:

答案 0 :(得分:3)

  

我想我真正得到的是为什么我在使用界面时需要将其释放?

接口只告诉您 如何正确处理资源,而不是 时执行此操作。你必须自己决定。

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

答案 1 :(得分:1)

当您的班级包含由您的班级管理的一次性字段时 - 我的意思是,它们已经在您的课程中实现了 - 那么您的班级也应该实现IDisposable界面。

如果您不再需要处置Disposable对象,则不确定何时将丢弃对象。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

使用接口并不意味着您不需要采用适当的处理技术。

答案 4 :(得分:0)

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

接口与否,您创建了对象,因此您(通常)负责清理它。由于它是一次性的,这是要走的路。

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