Compartir a través de


CA1001: Los tipos que poseen campos descartables deben ser descartables

Nombre de tipo

TypesThatOwnDisposableFieldsShouldBeDisposable

Identificador de comprobación

CA1001

Categoría

Microsoft.Design

Cambio problemático

No problemático: si el tipo no es visible fuera del ensamblado.

Problemático: si el tipo es visible fuera del ensamblado.

Causa

Una clase declara e implementa un campo de instancia que es un tipo System.IDisposable y la clase no implementa IDisposable.

Descripción de la regla

Una clase implementa la interfaz IDisposable para desechar recursos no administrados que posee. Un campo de instancia que es un tipo IDisposable indica que el campo posee un recurso no administrado. Una clase que declara un campo IDisposable posee indirectamente un recurso no administrado y debería implementar la interfaz IDisposable. Si la clase no posee directamente ningún recurso no administrado, no debe implementar un finalizador.

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente IDisposable y, desde el método IDisposable.Dispose, llame al método Dispose del campo.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El ejemplo siguiente muestra una clase que infringe la regla y otra que la cumple implementando IDisposable. La clase no implementa un finalizador porque no posee directamente ningún recurso no administrado.

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

Reglas relacionadas

CA2213: Aplique Dispose a los campos a los que se pueda

CA2216: Los tipos descartables deben declarar el finalizador

CA2215: Los métodos Dispose deben llamar a Dispose de clase base

CA1049: Los tipos que poseen recursos nativos deben ser descartables