Sdílet prostřednictvím


CA2213: Uvolnitelné pole by mělo být uvolněno

Název_typu

DisposableFieldsShouldBeDisposed

CheckId

CA2213

Kategorie

Microsoft.Usage

Změnit rozdělení

Bez rozdělení

Příčina

Typ, který implementuje IDisposable prohlašuje polí, která jsou typy, které také implementovat IDisposable.Dispose Nebyla volána metoda pole Dispose metoda deklarující typ.

Popis pravidla

Typ je zodpovědný za vyřazení všech jeho nespravované prostředky; To lze provést pomocí IDisposable.Toto pravidlo zkontroluje, zda jednorázových typu T prohlašuje pole F je instance jednorázových typu FT.Pro každé pole F, pravidlo se pokusí najít volání FT.Dispose.Pravidlo hledá metody volány T.Disposea nižší úrovni (metody volány metody volány FT.Dispose).

Jak opravit porušení

Porušení tohoto pravidla opravíte volání Dispose na pole, která jsou typy, které implementují IDisposable Pokud zodpovídáte za přidělení a uvolnění nespravované prostředky držení pole.

Při potlačení upozornění

Je bezpečné potlačit varování od tohoto pravidla, pokud není odpovědný za uvolnění prostředků držených pole nebo pokud volání Dispose dojde k volání úroveň hlubší než pravidla kontroly.

Příklad

Následující příklad ukazuje typ TypeA , implementuje IDisposable (FT previosu diskuse).

using System;  

namespace UsageLibrary
{
    public class  TypeA :IDisposable
    {

        protected virtual void Dispose(bool disposing) 
        {
            if (disposing) 
            {
                // Dispose managed resources
            }

            // Free native resources
        }

        public void Dispose()
        {

                Dispose(true);

                GC.SuppressFinalize(this);

        }

        // Disposable types implement a finalizer.
        ~TypeA()
        {
            Dispose(false);
        }
    }
}

Následující příklad ukazuje typ TypeB , toto pravidlo porušují prohlášením pole aFieldOfADisposableType (F v předchozí diskusi) jako typ jednorázových (TypeA) a volání není Dispose na poli.TypeBodpovídá T v předchozí diskusi.

using System;  

namespace UsageLibrary
{
   public class  TypeB : IDisposable
   {
      // Assume this type has some unmanaged resources.
      TypeA aFieldOfADisposableType = new TypeA();
      private bool disposed = false;

      protected virtual void Dispose(bool disposing) 
      {
         if (!disposed) 
         {
            // Dispose of resources held by this instance. 

            // Violates rule: DisposableFieldsShouldBeDisposed. 
            // Should call aFieldOfADisposableType.Dispose();

            disposed = true;
             // Suppress finalization of this disposed instance. 
             if (disposing)
             {
                 GC.SuppressFinalize(this);
             }
         }
      }

      public void Dispose()
      {
         if (!disposed)
         {
            // Dispose of resources held by this instance.
            Dispose(true);
         }
      }

      // Disposable types implement a finalizer.
      ~TypeB()
      {
         Dispose(false);
      }
   }
}

Viz také

Referenční dokumentace

IDisposable

Další zdroje

Implementing Finalize and Dispose