Tipos que possuem campos descartáveis devem ser descartáveis

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Category (Categoria)

Microsoft.Design

Quebrando alterar

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

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

Causa

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

Descrição da regra

Uma classe implementa a IDisposable interface de descarte de recursos não gerenciados que ele possui. Um campo de instância que é um IDisposable 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 o IDisposable interface. Se a classe não possuir diretamente quaisquer recursos não gerenciados, ele não deve implementar um finalizador.

Como corrigir violações

Para corrigir uma violação dessa regra, implementar IDisposable e a partir do IDisposable.Dispose método o campo da telefonar Dispose método.

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 implementar um finalizador porque não possui diretamente quaisquer 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

Campos descartáveis devem ser descartados

Tipos descartáveis devem declarar finalizador

Tipos que possuem recursos nativo devem ser descartáveis