Dispose vs Dispose(bool)

Vac*_*ano 36 c# dispose

我很困惑处置.我正在尝试让我的代码正确处理资源.所以我一直在将我的类设置为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要求我使用它?


感谢所有的好答案.我想我现在明白了.这是

答案就像我看到的那样:

处置"非管理"资源分为两类:

  1. 包含在托管类(即Bitmap,Font等)中的资源,但仍需要调用Dispose来正确清理它们.
  2. 您已分配的资源,即本机资源的表示(即需要发布的设备上下文)

Dispose(bool)用于表示两者之间的区别:

  1. 当直接在您的对象上调用Dispose时,您希望释放两种"非托管"资源.
  2. 当您的对象用于垃圾收集时,您不必担心第一种资源.垃圾收集器在清理它们时会处理它们.您只需要担心已分配的真实本机资源(如果有).

Kum*_*mar 9

Dispose(bool)是一种实现FinalizeDispose清理非托管资源的模式,请参阅此详细信息

  • 好的链接.处置模式是处理受管资源的必备条件. (3认同)
  • @里奇·梅尔顿:我认为这是一种反模式。一个类应处理托管资源,一个非托管资源或一组紧密耦合的非托管资源。处理任何托管资源的类不应处理任何非托管资源。由于其后代将处理托管资源,因此其后代也不应处理非托管资源。当后代类不应该添加终结器时,为什么还要这样做呢? (2认同)

小智 7

Dispose(bool)并不意味着公开,这就是为什么你没有看到它Font.

如果你的类的一些用户忘记调用Dispose你的方法,你将释放非托管资源,只有通过调用到Dispose(false)Finalizer.

如果IDispose正确调用,调用Dispose上托管的资源和采取非托管照顾.

标志是区分这两种情况.

这是MSDN推荐的模式.

  • 如果它是支持IDisposable的托管对象,那么是的,我们在Dispose(true)中执行它.您不必担心Bitmap是否会保留非托管资源,尤其是在Bitmap类遵循上述模式的情况下. (2认同)
  • 对.位图类有自己的终结器,就你的类而言它只是一个需要处理的托管对象. (2认同)

Kyl*_*man 7

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)在类中创建方法来修复您获得的警告,并使终结器调用该方法.