一次性类

时间:2011-12-28 09:21:58

标签: c# .net-2.0

请考虑以下课程:

public class Level : IDisposable
{
   public Level() { }

   public void Dispose() { }
}

我的问题是,如果我调用Dispose方法,该类是否会被处理(垃圾收集)?

前:

Level level = new Level();
level.Dispose();

感谢。

6 个答案:

答案 0 :(得分:9)

  

我的问题是,如果我调用Dispose方法,该类实际上会被处理吗?

如果通过处理你的意思是垃圾收集,那么不,这不会发生。调用Dispose方法时会发生什么,调用Dispose方法并执行它的主体。

此外,建议将一次性资源包装在using statement中,以确保即使在发生异常时也始终会调用Dispose方法。所以不用手动调用它,你可以:

using (Level level = new Level())
{
    // ... do something with the level
}

通常,当对象保存指向某些非托管资源的指针并提供确定性释放这些资源的机制时,将使用Dispose方法。

答案 1 :(得分:3)

我认为你所追求的是一种知道Dispose()被召唤的方式吗?

您可以在使用代码中执行此操作,方法是在处置后将实例设置为null

Level level = new Level();
//do stuff with the instance..
level.Dispose();
level = null;

//in other place:
if (level != null)
{
    //still available
}

或者在类本身中,添加布尔标志并在每个方法中检查它:

public class Level : IDisposable
{
    private bool disposing = false;
    public Level() { }

    public void Foo()
    {
        if (disposing)
            return;
        MessageBox.Show("foo");
    }

    public void Dispose()
    {
        if (disposing)
            return;
        disposing = true;
    }
}

答案 2 :(得分:0)

每个实现IDisposable的类都定义了要处置的含义。通过这种推理,是的,你的班级将按照它想要的那样处置。

答案 3 :(得分:0)

不,由于调用Dispose,实例不会被垃圾收集。 Dispose方法是您可以释放实例持有的任何资源的地方,它不是要处置实例本身。

答案 4 :(得分:0)

如果你打电话给Dispose()它会被处理,并不绝对意味着它将被垃圾收集,在我看来这是你的问题,如果没有请澄清。< / p>

答案 5 :(得分:0)

在.NET中,处理和垃圾收集是两回事:

处理的目的是释放任何不是由.NET管理的资源(如手动分配的内存),或者有兴趣在不再需要时释放它们(如文件句柄或网络连接)

垃圾收集的目的是释放由.NET管理的内存(与普通对象一样)。

所以,正如其他人所指出的那样:你的对象在被处置时不一定会被垃圾收集。