簡體   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