CA1001: Os tipos que possuem campos descartáveis devem ser descartáveis
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Não-separável - se o tipo não é visível fora do assembly. Dividindo - se o tipo for visível fora do assembly. |
Causa
Uma classe declara e implementa um campo de instância é um System.IDisposable tipo e a classe não implementa IDisposable.
Descrição da regra
Uma classe que implementa o IDisposable interface descarte de recursos não gerenciados que ele possui. Um campo de instância é um IDisposable o 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 a IDisposable interface. Se a classe não possui todos os recursos não gerenciados diretamente, ele não deve implementar um finalizador.
Como corrigir violações
Para corrigir uma violação desta regra, implementar IDisposable e o IDisposable.Dispose chamada de método de Dispose método do campo.
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 não implementa um finalizador porque a classe não possui todos os recursos não gerenciados diretamente.
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: Campos descartáveis devem ser descartados.
CA2216: Tipos descartáveis devem declarar o finalizador
CA2215: Métodos Dispose devem chamar dispose de classe base
CA1049: Os tipos que possuem recursos nativos devem ser descartáveis