集合 class 和 IDisposable 接口

Collection class and IDisposable interface

我最近一直在阅读有关 IDisposable 接口的内容(这个主题非常有用 Proper use of the IDisposable interface) and also about usage of using statement (topic Uses of "using" in C#)。然后我开始想如果我应该以某种方式从内存中释放我自己的集合 class 会怎样。

class User{
    private string username {set;get;}
    private string password {set;get;}
    ...
}

它应该实现 IDisposable 接口吗?

class User : IDisposable
{
    ...
    public void Dispose()
    {
        this.Dispose();
    }
}

所以它可以从内存中释放出来?还是 GC 会自动执行,我什至不应该为此烦恼。

据我所知,释放数据库连接等非托管资源很重要,但是那些集合 classes 呢?由于我经常使用它们,所以它真的开始困扰我了。

tl;博士; 我应该在用户 class 上实施 IDisposable 吗?

亲切的问候。


编辑:感谢大家的回复!

Or does GC do it automaticly and I shouldn't even bother about it.

这个。除非你有非托管资源(直接或通过引用其他可支配的资源),你几乎肯定不应该实现 IDisposable.

您当前的实现只会调用自身:

public void Dispose()
{
    this.Dispose();
}

...所以假设您真的不想调用 this.Dispose(),当调用 Dispose() 时,您 做什么?这不像处置会导致垃圾收集 - 那么您想采取什么行动?如果答案是 "nothing",那么您可能不应该实施 IDisposable。 (这里的例外情况是,如果它被设计为基础 class 并且您期望 一些 派生的 classes 需要处理......那更复杂的场景。)

所有未使用的资源最终将在程序卸载时或在单独的间隔后(如果资源不再使用)被垃圾收集。

更好的做法是 clean/dispose 当您不再希望使用已用资源(变量、对象)来释放内存时。

正如在其他答案中所说,只有当您处理非托管资源或 class 成员时,您才 必须 实现IDisposable 自己(在这种情况下,您应该在自己的 Dispose 方法中处理它们)。

您可能会看到的另一种情况是人们希望使用 using { } 语法糖在变量作用域末尾自动调用某些方法而不使用 try { } finally { } 形式。

即:

public class MyObject : IDisposable
{
    public void Foo()
    {
    }

    public void Dispose()
    {
        // Something they want to call after the use of an instance of MyObject
    }
}
...
using (var myObj = new MyObject())
{
    myObj.Foo();
}

而不是

public class MyObject
{
    public void Foo()
    {
    }

    public void MethodToCallAfterUse()
    {
        // Something they want to call after the use of an instance of MyObject
    }
}

var myObj = new MyObject(); 
try
{
    myObj.Foo();
}
finally
{
    myObj.MethodToCallAfterUse();
}

如果一个对象请求一个外部实体代表它"do something"(执行一个动作,保留一个资源等)直到另行通知,并且该外部实体可能在对象请求它之后继续存在服务不再有用,则对象应确保外部实体在不再需要其服务时收到通知。 IDisposable 资源作为对象可以说 "I may be obligated to let outside entities know when I don't need their services; let me know when my services will no longer be needed, so I can satisfy my obligation to tell any outside entities that I no longer need their services."

的标准方式存在

在 .NET 中,一旦在宇宙中任何地方都不存在对某个对象的引用,该对象本身也将不复存在。如果知道有义务执行某项操作的唯一对象在未执行该操作的情况下不复存在,则该操作将不会执行。但是,如果一个对象没有任何义务,一旦没有引用就让它不复存在就好了。