我很困惑处置.我正在尝试让我的代码正确处理资源.所以我一直在将我的类设置为IDisposable(使用Dispose方法),确保调用Dispose方法.
但是现在FXCop告诉我很多关于Disposing = false和调用Dispose(false)的东西.
我没有看到一个带有bool的Dispose方法.我需要制作一个吗?如果是这样,为什么?为什么不在处理时调用一个方法呢?
我在这里看到了一些代码:http://msdn.microsoft.com/en-us/library/ms244737.aspx,它展示了如何制作一个带有bool的Disposing方法.它表示它适用于本地和管理资源. 但我认为处理的全部内容仅适用于非管理资源.
此外,FXCop抱怨的路线是这样的:
~OwnerDrawnPanel()
{
_font.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
它说:
CA1063:Microsoft.Design:修改'OwnerDrawnPanel .~ OwnerDrawnPanel()',以便它调用Dispose(false)然后返回.
但是Font上没有Dispose(bool)(我能找到).
为什么我需要Dispose(bool)?如果我这样做,为什么Font没有呢?因为它没有它,为什么FXCop要求我使用它?
感谢所有的好答案.我想我现在明白了.这是
处置"非管理"资源分为两类:
Dispose(bool)用于表示两者之间的区别:
小智 7
Dispose(bool)
并不意味着公开,这就是为什么你没有看到它Font
.
如果你的类的一些用户忘记调用Dispose你的方法,你将释放非托管资源,只有通过调用到Dispose(false)
的Finalizer
.
如果IDispose正确调用,调用Dispose上托管的资源和也采取非托管照顾.
标志是区分这两种情况.
这是MSDN推荐的模式.
IDisposable
提供带签名的方法
public void Dispose()
Run Code Online (Sandbox Code Playgroud)
Microsoft最佳实践(http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx)建议使用签名制作第二个私有方法
private void Dispose(bool)
Run Code Online (Sandbox Code Playgroud)
您的公共Dispose方法和Finalizer应调用此私有Dispose方法以防止多次处置受管资源.
您可以通过在dispose方法中实现IDisposable和处理字体对象,或Dispose(bool)
在类中创建方法来修复您获得的警告,并使终结器调用该方法.
归档时间: |
|
查看次数: |
18542 次 |
最近记录: |