CA1001: tipos que tenham campos descartáveis devem ser descartáveis
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Sem-quebras - se o tipo não é visível fora do assembly. Interromper - se o tipo é visível fora do assembly. |
Causa
Uma classe declara e implementa um campo da instância que é um tipo de IDisposable e a classe não implementa IDisposable.
Descrição da Regra
Uma classe implementa a interface de IDisposable para descartar os recursos não gerenciados que possui o.Um campo da instância que é um tipo de IDisposable indica que o campo possui um recurso não gerenciado.Uma classe que declara um campo de IDisposable indiretamente possui um recurso não gerenciado e deve implementar a interface de IDisposable .Se a classe não possuir nenhum diretamente recursos não gerenciados, não deve implementar um finalizador.
Como Corrigir Violações
Para corrigir uma violação desta regra, implemente IDisposable e o método de IDisposable.Dispose chamar o método de Dispose do campo.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo
O exemplo a seguir mostra uma classe que viola a regra e uma classe que satisfaça a regra implementando IDisposable.A classe não implementa um finalizador porque a classe não possuir nenhum diretamente os 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
CA2213: os campos descartáveis devem ser descartados
CA2216: os tipos descartáveis devem declarar o finalizador
CA2215: os métodos de descarte devem chamar o descarte da classe base
CA1049: tipos que tenham recursos nativos devem ser descartáveis