一次性类

本文关键字:一次性 | 更新日期: 2023-09-27 18:19:06

请考虑以下类:

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

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

,

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

谢谢。

一次性类

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

如果你所说的处置是指垃圾收集,那么不,这不会发生。当你调用Dispose方法时,会发生什么呢? Dispose方法被调用,它的主体被执行。

还建议将一次性资源包装在using语句中,以确保即使在发生异常的情况下也始终调用Dispose方法。所以除了手动调用它,你可以:

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

通常,Dispose方法用于对象持有指向某些非托管资源的指针,并提供一种确定性地释放这些资源的机制。

我认为您所追求的是一种知道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;
    }
}

每个实现IDisposable的类定义了被处置的含义。通过这种推理,是的,您的类将像它想要的那样被处理。

不,实例不会因为调用Dispose而被垃圾收集。Dispose方法可以释放实例持有的任何资源,而不是处理实例本身。

如果您调用Dispose(),它将被处置,其中并不绝对意味着它将被垃圾收集,在我看来这是您的问题,如果不是请澄清。

在。net中,垃圾处理和垃圾收集是两件不同的事情:

处置的目的是释放任何不是由。net管理的资源(如手动分配的内存),或者在不再需要时立即释放的资源(如文件句柄或网络连接)。

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

因此,正如其他人指出的那样:您的对象在处理时不一定会被垃圾收集。