Tipos que possuem campos descartáveis devem ser descartáveis
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
Não separável - se o tipo não estiver visível fora do assembly. Dividindo - se o tipo estiver visível fora do assembly. |
Causa
Uma classe declara e implementa um campo de instância que é um System.IDisposable tipo e a classe não implementa IDisposable.
Descrição da regra
Uma classe implementa a IDisposable interface de descarte de recursos não gerenciados que ele possui. Um campo de instância que é um IDisposable 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 o IDisposable interface. Se a classe não possuir diretamente quaisquer recursos não gerenciados, ele não deve implementar um finalizador.
Como corrigir violações
Para corrigir uma violação dessa regra, implementar IDisposable e a partir do IDisposable.Dispose método o campo da telefonar Dispose método.
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 implementar um finalizador porque não possui diretamente quaisquer 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
Campos descartáveis devem ser descartados