CA1001: Os tipos que possuem campos descartáveis devem ser descartáveis

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável - se o tipo não é visível fora do assembly.

Dividindo - se o tipo for visível fora do assembly.

Causa

Uma classe declara e implementa um campo de instância é um System.IDisposable tipo e a classe não implementa IDisposable.

Descrição da regra

Uma classe que implementa o IDisposable interface descarte de recursos não gerenciados que ele possui. Um campo de instância é um IDisposable o tipo indica que o campo possui um recurso não gerenciado. Uma classe que declara um IDisposable campo indiretamente possui um recurso não gerenciado e deve implementar a IDisposable interface. Se a classe não possui todos os recursos não gerenciados diretamente, ele não deve implementar um finalizador.

Como corrigir violações

Para corrigir uma violação desta regra, implementar IDisposable e o IDisposable.Dispose chamada de método de Dispose método do campo.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra uma classe que viola a regra e uma classe que satisfaça a regra com a implementação de IDisposable. A classe não implementa um finalizador porque a classe não possui todos os recursos não gerenciados diretamente.

Imports System
Imports System.IO

Namespace DesignLibrary

   ' This class violates the rule.
   Public Class NoDisposeMethod

      Dim newFile As FileStream

      Sub New()
         newFile = New FileStream("c:\temp.txt", FileMode.Open)
      End Sub

   End Class

   ' This class satisfies the rule.
   Public Class HasDisposeMethod 
      Implements IDisposable

      Dim newFile As FileStream

      Sub New()
         newFile = New FileStream("c:\temp.txt", FileMode.Open)
      End Sub

      Overloads Protected Overridable Sub Dispose(disposing As Boolean)

         If disposing Then
            ' dispose managed resources
            newFile.Close()
         End If

         ' free native resources

      End Sub 'Dispose


      Overloads Public Sub Dispose() Implements IDisposable.Dispose

         Dispose(True)
         GC.SuppressFinalize(Me)

      End Sub 'Dispose

   End Class

End Namespace
using System;
using System.IO;

namespace DesignLibrary
{
   // This class violates the rule.
   public class NoDisposeMethod
   {
      FileStream newFile;

      public NoDisposeMethod()
      {
         newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
      }
   }

   // This class satisfies the rule.
   public class HasDisposeMethod: IDisposable
   {
      FileStream newFile;

      public HasDisposeMethod()
      {
         newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
      }

      protected virtual void Dispose(bool disposing)
      {
         if (disposing)
            {
               // dispose managed resources
               newFile.Close();
            }
          // free native resources
      }

      public void Dispose()
      {
         Dispose(true);
         GC.SuppressFinalize(this);
      }
   }
}

Regras relacionadas

CA2213: Campos descartáveis devem ser descartados.

CA2216: Tipos descartáveis devem declarar o finalizador

CA2215: Métodos Dispose devem chamar dispose de classe base

CA1049: Os tipos que possuem recursos nativos devem ser descartáveis