CA1816: Chama 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 desse (Me em Visual Basic).
Descrição da regra
O IDisposable.Dispose método permite que os usuários a liberar recursos a qualquer momento antes do objeto tornando-se disponível para coleta de lixo.Se a IDisposable.Dispose método é chamado, ele libera os recursos do objeto.Isso torna desnecessária 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 tenham 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 implementação.
Alterar todas as chamadas para GC.SuppressFinalize passar esse (Me) em Visual Basic.
Quando suprimir avisos
Suprimir somente um aviso da regra, se você estiver 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 ou 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 ou 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: O métodos Dispose devem chamar dispose de classe base
CA2216: Tipos descartáveis devem declarar o finalizador