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