Udostępnij za pośrednictwem


CA2213: Pola usuwalne powinny zostać usunięte

TypeName

DisposableFieldsShouldBeDisposed

CheckId

CA2213

Kategoria

Microsoft.Usage

Złamanie zmiany

Bez podziału

Przyczyna

Typ, który implementuje IDisposable deklaruje pola, które są typów, które także implementują IDisposable.Dispose Metoda pola nie jest wywoływana Dispose metoda typ deklarujący.

Opis reguły

Typ jest odpowiedzialny za usuwania wszystkich jego niezarządzanych zasobów; Można to osiągnąć poprzez wdrożenie IDisposable.Ta reguła sprawdza, czy typ jednorazowe T deklaruje pole F oznacza to wystąpienie typu jednorazowe FT.Dla każdego pola F, reguła próbuje zlokalizować wywołanie do FT.Dispose.Reguła przeszukuje metody wywoływane przez T.Disposei jeden poziom niżej (metody o nazwie metodami wywołana przez FT.Dispose).

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, wywołać Dispose pól, które są typów, które implementują IDisposable Jeśli użytkownik jest odpowiedzialny za przydzielanie i zwalnianie zasobów niezarządzanego posiadanych przez pole.

Kiedy do pomijania ostrzeżenia

Można bezpiecznie pomija ostrzeżenia od tej reguły, jeśli nie jesteś odpowiedzialny dla zwalniania zasób posiadanych przez pole lub jeśli wywołanie Dispose występuje na poziomie wywołującego głębiej niż kontrole reguły.

Przykład

W poniższym przykładzie pokazano typu TypeA który implementuje IDisposable (FT w dyskusji previosu).

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);
        }
    }
}

W poniższym przykładzie pokazano typu TypeB , narusza reguły oświadczając, pole aFieldOfADisposableType (F w poprzednim podrozdziale) jako typ jednorazowe (TypeA) i nie wywołują Dispose na polu.TypeBodpowiada T w poprzednim podrozdziale.

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);
      }
   }
}

Zobacz też

Informacje

IDisposable

Inne zasoby

Implementing Finalize and Dispose