集合类和IDisposable接口

时间:2015-04-13 13:39:53

标签: c# memory garbage-collection dispose idisposable

我最近一直在阅读关于IDisposable接口(这个主题非常有用Proper use of the IDisposable interface)以及使用using语句(主题Uses of "using" in C#)。然后我开始想知道如果我应该以某种方式从记忆中释放我自己的集合类。

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

它应该实现IDisposable接口吗?

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

所以它可以从内存中释放出来?或者GC是否自动完成,我甚至不应该为此烦恼。

据我所知,释放非托管资源(如数据库连接等)非常重要,但这些集合类呢。因为我经常使用它们真的开始让我烦恼。

TL;博士; 我应该在User类上实现IDisposable吗?

亲切的问候。


编辑:感谢大家的回复!

4 个答案:

答案 0 :(得分:6)

  

或者GC是否自动完成,我甚至不应该为此烦恼。

此。除非你有非托管资源(直接或通过引用其他可以丢弃的东西),你几乎肯定不应该实现IDisposable

您当前的实施只会自称:

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

...所以假设你真的不想打电话给this.Dispose(),那么在调用Dispose()时你想要做什么 ?它不像处理导致垃圾收集 - 所以你想采取什么行动?如果答案是“无”,那么您可能不应该实施IDisposable。 (这里的例外是如果它被设计为基类,并且你期望某些派生类需要处理......这是一个更复杂的场景。)

答案 1 :(得分:0)

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

当您不再希望使用它们来释放内存时,清理/处理使用过的资源(变量,对象)是一种更好的做法。

答案 2 :(得分:0)

正如其他答案所述,您 实施IDisposable的唯一情况是当您处理非{@ 1}}的非托管资源或类成员时(在此你应该用你自己的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();
}

答案 3 :(得分:0)

如果某个对象要求外部实体代表其“做某事”(执行操作,保留资源等),直到另行通知为止,并且在请求其服务的对象停止后该外部实体可能继续存在为了有用,那么该对象应确保外部实体在不再需要其服务时收到通知。 IDisposable资源作为标准手段存在,通过该资源,对象可以说“我可能有义务让外部实体知道何时我不需要他们的服务;让我知道何时不再需要我的服务,所以我可以履行义务,告诉任何外部实体我不再需要他们的服务。“

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