CA1816: Chame GC.SuppressFinalize corretamente
TypeName |
CallGCSuppressFinalizeCorrectly |
CheckId |
CA1816 |
<strong>Categoria</strong> |
Microsoft. Uso |
Alteração significativa |
Não separável |
Causa
Um método que é uma implementação de IDisposable.Dispose não chama GC.SuppressFinalize.
Um método que não é uma implementação de IDisposable.Dispose chamadas GC.SuppressFinalize.
Um método chama GC.SuppressFinalize e passa a algo diferente neste (Me em Visual Basic).
Descrição da regra
O IDisposable.Dispose método permite que os usuários a liberar recursos em qualquer momento antes do objeto tornando-se disponíveis para coleta de lixo. Se o IDisposable.Dispose método é chamado, ele libera os recursos do objeto. Isso torna desnecessário a finalização. IDisposable.Disposedeve chamar GC.SuppressFinalize para que o coletor de lixo não chamar o finalizador do objeto.
Para impedir que os tipos derivados com finalizadores tendo reimplementar [System.IDisposable] e chamá-lo, sem lacre tipos sem finalizadores ainda devem chamar GC.SuppressFinalize.
Como corrigir violações
Para corrigir uma violação desta regra:
Se o método é uma implementação de Dispose, adicione uma chamada para GC.SuppressFinalize.
Se o método não é uma implementação de Dispose, ou remova a chamada para GC.SuppressFinalize ou movê-lo para o tipo Dispose de implementação.
Alterar todas as chamadas para GC.SuppressFinalize para passar esta (Me) em Visual Basic.
Quando suprimir avisos
Suprimir somente um aviso da regra, se você está deliberating usando GC.SuppressFinalize para controlar o tempo de vida de outros objetos. Não suprimir um aviso de que essa regra se uma implementação de Dispose não chama GC.SuppressFinalize. Nessa situação, falhando suprimir a finalização degrada o desempenho e não fornecer nenhum benefícios.
Exemplo
O exemplo a seguir mostra um método que incorretamente chamadas GC.SuppressFinalize.
Imports System
Imports System.Data.SqlClient
Namespace Samples
Public Class DatabaseConnector
Implements IDisposable
Private _Connection As New SqlConnection
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(True) ' Violates rules
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If _Connection IsNot Nothing Then
_Connection.Dispose()
_Connection = Nothing
End If
End If
End Sub
End Class
End Namespace
using System;
using System.Data.SqlClient;
namespace Samples
{
public class DatabaseConnector : IDisposable
{
private SqlConnection _Connection = new SqlConnection();
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true); // Violates rule
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_Connection != null)
{
_Connection.Dispose();
_Connection = null;
}
}
}
}
}
O exemplo a seguir mostra um método que corretamente chamadas GC.SuppressFinalize.
Imports System
Imports System.Data.SqlClient
Namespace Samples
Public Class DatabaseConnector
Implements IDisposable
Private _Connection As New SqlConnection
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If _Connection IsNot Nothing Then
_Connection.Dispose()
_Connection = Nothing
End If
End If
End Sub
End Class
End Namespace
using System;
using System.Data.SqlClient;
namespace Samples
{
public class DatabaseConnector : IDisposable
{
private SqlConnection _Connection = new SqlConnection();
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_Connection != null)
{
_Connection.Dispose();
_Connection = null;
}
}
}
}
}
Regras relacionadas
CA2215: Métodos Dispose devem chamar dispose de classe base
CA2216: Tipos descartáveis devem declarar o finalizador
Consulte também
Referência
Implementando finalizar e Dispose para limpeza de recursos não gerenciados