Partilhar via


CA2213: os campos descartáveis devem ser descartados

TypeName

DisposableFieldsShouldBeDisposed

CheckId

CA2213

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um tipo que implementa IDisposable declara os campos que são de tipos que também implementam IDisposable.O método de Dispose do campo não é chamado pelo método de Dispose do tipo declarando.

Descrição da Regra

Um tipo é responsável para descartar de todos os recursos não gerenciados; isso é feito implementando IDisposable.Esta regra verifica se um tipo descartável T declara um campo F que é uma instância de um tipo descartável FT.Para cada campo F, a regra tenta localizar uma chamada a FT.Dispose.A regra pesquisa os métodos chamados por T.Dispose, e um mais nível inferior (os métodos chamados pelos métodos chamados por FT.Dispose).

Como Corrigir Violações

Para corrigir uma violação desta regra, chame Dispose nos campos que são de tipos que implementam IDisposable se você é responsável para alocar e libere os recursos não gerenciados mantidos pelo campo.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se você não é responsável para liberar o recurso ocupado pelo campo, ou se a chamada a Dispose ocorre no nível mais profundo de chamada do que a regra verifica.

Exemplo

O exemplo a seguir mostra um tipo TypeA que implementa IDisposable (FT na discussão de 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);
        }
    }
}

O exemplo a seguir mostra um tipo TypeB que viola esta regra declarando um campo aFieldOfADisposableType (F na discussão anterior) como um tipo descartável (TypeA) e não chamando Dispose no campo.TypeB corresponde a T na discussão anterior.

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

Consulte também

Referência

IDisposable

Outros recursos

Implementing Finalize and Dispose