Partilhar via


CA1001: tipos que tenham campos descartáveis devem ser descartáveis

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Categoria

Microsoft.Design

Alteração Significativa

Sem-quebras - se o tipo não é visível fora do assembly.

Interromper - se o tipo é visível fora do assembly.

Causa

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

Descrição da Regra

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

Como Corrigir Violações

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

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra uma classe que viola a regra e uma classe que satisfaça a regra implementando IDisposable.A classe não implementa um finalizador porque a classe não possuir nenhum diretamente os recursos não gerenciados.

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: os campos descartáveis devem ser descartados

CA2216: os tipos descartáveis devem declarar o finalizador

CA2215: os métodos de descarte devem chamar o descarte da classe base

CA1049: tipos que tenham recursos nativos devem ser descartáveis