CA2216: Tipos descartáveis devem declarar finalizador
Property | valor |
---|---|
ID da regra | CA2216 |
Título | Tipos descartáveis devem declarar finalizador |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Motivo
Um tipo que implementa e tem campos que sugerem o uso de recursos não gerenciados System.IDisposable, não implementa um finalizador conforme descrito por System.Object.Finalize.
Descrição da regra
Uma violação desta regra é relatada se o tipo descartável contiver campos dos seguintes tipos:
Como corrigir violações
Para corrigir uma violação dessa regra, implemente um finalizador que chame seu Dispose método.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se o tipo não for implementado IDisposable com a finalidade de liberar recursos não gerenciados.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplo
O exemplo a seguir mostra um tipo que viola essa regra.
public class DisposeMissingFinalize : IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
Regras conexas
CA1816: Ligue para GC. SuppressFinalize corretamente