Dispose vs Dispose(布尔)
我对处置感到困惑。 我试图让我的代码正确地处理资源。 所以我一直将我的类设置为IDisposable(使用Dispose方法),确保Dispose方法被调用。
但是现在FXCop告诉我很多关于Disposing = false和Dispose(false)的东西。
我没有看到一个需要布尔的Dispose方法。 我需要制作一个吗? 如果是这样,为什么? 为什么不只是有一个方法在处置时被调用?
我在这里看到了一些代码:http://msdn.microsoft.com/en-us/library/ms244737.aspx,它显示了如何制作一个采用bool的Disposing方法。 它表示这是为了管理资源。 但我认为处置的全部意义只在于非托管资源。
此外,FXCop所抱怨的是这样的:
~OwnerDrawnPanel()
{
_font.Dispose();
}
它说:
CA1063:Microsoft.Design:修改'OwnerDrawnPanel。〜OwnerDrawnPanel()',以便它调用Dispose(false)然后返回。
但是Font没有Dispose(布尔)(我可以找到)。
把它们加起来:
为什么我需要Dispose(布尔)? 如果我这样做,为什么不Font有它? 由于它没有它,为什么FXCop要我使用它?
感谢所有伟大的答案。 我想我现在明白了。 这是
我看到的答案是:
处置“非托管”资源分为两类:
Dispose(布尔)用于说明两者之间的区别:
IDisposable
提供了一个签名方法
public void Dispose()
Microsoft最佳做法(http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx)建议使用签名制作第二个私有方法
private void Dispose(bool)
您的公共Dispose方法和Finalizer应调用此私有Dispose方法以防止多次处理托管资源。
您可以通过在dispose方法中实现IDisposable并处理字体对象或在类中创建Dispose(bool)
方法来修复警告,并使您的终结器调用该方法。
Dispose(bool)
是一种实现Finalize
和Dispose
以清理非托管资源的模式,请参阅此处了解详细信息
Dispose(bool)
不是公开的,这就是为什么你没有看到它在Font
。
如果您的类的某些用户忘记在您的方法上调用Dispose,则只有在Finalizer
调用Dispose(false)
才会释放非托管资源。
在IDispose调用正确的情况下,您可以在托管资源上调用Dispose,并照顾非托管资源。
国旗是为了区分这两种情况。
这是MSDN推荐的模式。
链接地址: http://www.djcxy.com/p/54511.html