我正在开发一个类,我必须处理托管和非托管资源,看起来像这样(显然只有处置部分):
class MyDisposingExample : IDisposable
{
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool callFromDispose)
{
// free unmanaged resources here
if (callFromDispose)
{
// free managed resources here
GC.SuppressFinalize(this);
}
}
~MyDisposingExample()
{
Dispose(false);
}
}
然后我想到了一个念头。为什么要打扰第二个Dispose函数?为什么我不能这样做:
class MyDisposingExample2 : IDisposable
{
public void Dispose()
{
// free unmanaged resources here
// free managed resources here
GC.SuppressFinalize(this);
}
~MyDisposingExample2()
{
Dispose();
}
}
通常的处理模式解决了几个问题,所有这些问题似乎都是通过这个例子解决的,没有额外的方法。
1)如果显式调用Dispose()方法,它将释放托管资源,非托管资源并禁止终结器,以便以后再次释放资源。
2)如果没有明确调用方法Dispose(),终结器将运行Dispose(),免费托管资源,释放非托管资源并禁止终结器(我们稍后会回到这一点)。 / p>
从表面上看,这种模式提供了之前模式所做的一切。如果我不再需要它,我可以明确地处理我的对象,如果我忘记自己处理它并且不用担心资源被释放两次,我的对象就会被隐瞒。
美中不足的似乎是我在终结器本身内调用GC.SuppressFinalize(),但是......为什么不呢? According to MSDN:
此方法在obj的对象标头中设置一个位,运行时在调用终结器时进行检查。
所以我所做的就是设置一下。一旦它被运行,这不应该影响终结器,因为在调用终结器之前必须进行位检查。
由于我没有在任何地方看到这种模式,我必须假设它有问题。我错过了什么?