CS.IDISP.DISPOSE

IDisposable が実装されている場合、仮想メソッドとして Dispose(bool) を実装します。

IDisposable インターフェイスを実装するための標準的な設計パターンは、Dispose() メソッドとファイナライザー (デストラクター) を両方とも実装することです。これらの両方に共通するコードは、保護されて、仮想的である共通メソッドに除外されます。 共通メソッドは、Dispose() メソッドから、またはファイナライザーから呼び出されているかどうかを示すパラメーターを扱います。

脆弱性とリスク

コードが複製されると、ある部分で修正されたバグは別の部分で修正されない可能性があります。

軽減と防止

標準設計を実装することで、プログラムを理解しやすくなり、潜在的なバグを回避できます。Dispose が実装されると、リソースを解放するコードが常に存在することになります。このコードも、ファイナライザーの一部になります。このため、共通コードを除外するのは意味があることです。

脆弱コード例

コピー
  // VIOLATION: This class does not implement the
  // Dispose(bool) method that is called from both
  // Dispose() and the destructor.The code for
  // freeing resources is repeated in both Dispose()
  // and the destructor.
  using System;
  
  public class A : IDisposable
  {
     public A()
     {
         // resource allocated here
     }
     ~A()
     {
         // Free resources here
     }
     public virtual void Dispose()
     {
         // Free resources here.
         GC.SuppressFinalize();
     }
 }

修正コード例

コピー
  // FIXED: The problem here is fixed by implementing the
  // Dispose method that takes a bool paramter.Note that the
  // method is called from both Dispose() and ~A.
  using System;
  public class A : IDisposable
  {
      private bool _alreadyDisposed = false;
      public A()
      {
         // resource allocated here
     }
     ~A()
     {
         // Dispose() called from the destructor
         Dispose(false);
     }
     public virtual void Dispose()