一次性类
本文关键字:一次性 | 更新日期: 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管理的内存(像普通对象一样)。
因此,正如其他人指出的那样:您的对象在处理时不一定会被垃圾收集。