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要我使用它?


感谢所有伟大的答案。 我想我现在明白了。 这是

我看到的答案是:

处置“非托管”资源分为两类:

  • 包含在托管类中的资源(即Bitmap,Font等),但仍然需要调用Dispose来正确清理它们。
  • 您已分配的资源(即本地资源的表示形式)(即需要释放的设备上下文)
  • Dispose(布尔)用于说明两者之间的区别:

  • 直接在对象上调用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)是一种实现FinalizeDispose以清理非托管资源的模式,请参阅此处了解详细信息


    Dispose(bool)不是公开的,这就是为什么你没有看到它在Font

    如果您的类的某些用户忘记在您的方法上调用Dispose,则只有在Finalizer调用Dispose(false)才会释放非托管资源。

    在IDispose调用正确的情况下,您可以在托管资源上调用Dispose,并照顾非托管资源。

    国旗是为了区分这两种情况。

    这是MSDN推荐的模式。

    链接地址: http://www.djcxy.com/p/54511.html

    上一篇: Dispose vs Dispose(bool)

    下一篇: Using keyword and Managed\UnManaged code