Compartir a través de


Los tipos que poseen campos desechables deben ser desechables

Actualización: noviembre 2007

     TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

Identificador de comprobación

CA1001

Category

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.

Motivo

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 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

Los campos disponibles deben eliminarse

Los tipos disponibles deben declarar el finalizador

Los tipos que poseen recursos nativos deben estar disponibles