繁体   English   中英

如何使用第三方库正确实现一次性模式

[英]How to correctly implement disposable pattern with third-party libraries

假设我有以下课程:

class Foo : IDisposable
{
  public void Dispose()
  {
    bar.Dispose();
  }

  private Bar bar = new Bar();
}

class Bar : IDisposable
{
  public void Dispose()
  {
    baz.Dispose();
  }

  private SomeThirdPartyLibraryClass baz = new SomeThirdPartyLibraryClass();
}

使用using语句时,此代码可以很好地工作:

using (Foo foo = new Foo())
{
  // ...
}
// All resources should be disposed at this time

但是,如果由于某种原因此类的用户忘记使用using语句,则资源将永远不会被处置。

根据MSDN,我应该以以下方式实现一次性模式:

class Foo : IDisposable
{
  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }

  protected virtual void Dispose(bool disposing)
  {
    if (disposed)
      return; 

    if (disposing) {
      // Free any managed objects here.
      //
    }

    // Free any unmanaged objects here.
    //
    disposed = true;
  }

  ~Foo()
  {
    Dispose(false);
  }

  bool disposed = false;
  private Bar bar = new Bar();
}

Bar

但是我应该在哪里放置bar.Dispose(); baz.Dispose(); 码?

应该在“托管清理”部分还是“非托管清理”部分下?

顾名思义,我不知道SomeThirdPartyLibraryClass的实现(无论如何,它可以随着时间改变)。

那我该怎么办?

但是我应该在哪里放置bar.Dispose(); 和baz.Dispose(); 码?

由于您的第三方库似乎是托管代码,因此将在“托管清理”部分中进行。

您应该在Dispose的托管部分下调用bar and baz的Dispose of bar and baz,因为对于您的类而言,它们是托管对象。 如果bar和baz具有不受管理的内容,则应在其Dispose / Finalize实现中通过各自的类对其进行清理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM