telefonar GC.SuppressFinalize corretamente
TypeName |
CallGCSuppressFinalizeCorrectly |
CheckId |
CA1816 |
Category (Categoria) |
Microsoft.Uso |
Quebrando alterar |
Não separável |
Causa
Um método que é uma implementação de Dispose não telefonar GC.SuppressFinalize.
- ou -
Um método que não é uma implementação de Dispose chamadas GC.SuppressFinalize.
- ou -
Um método chama GC.SuppressFinalize e passa algo diferente de this (Me no Visual Basic).
Descrição da regra
The Dispose método permite que os usuários liberar recursos a qualquer momento antes do objeto tornando-se disponível para a coleta de lixo. Se o Dispose método é chamado, ele libera recursos do objeto. Isso torna desnecessário finalização.Dispose deve telefonar GC.SuppressFinalize para que o coletor de lixo não telefonar o finalizador do objeto.
Para impedir que tipos derivados com finalizadores precisar 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 dessa regra:
Se o método é uma implementação de Dispose, adicione uma telefonar para GC.SuppressFinalize.
Se o método não é uma implementação de Dispose, ou remova a telefonar para GC.SuppressFinalize ou movê-la para o tipo Dispose implementação.
Alterar todas as chamadas de GC.SuppressFinalize para passar this (Me no Visual Basic).
Quando suprimir avisos
Suprimir somente um aviso dessa regra se são deliberating usando GC.SuppressFinalize para controlar o tempo de vida de outros objetos. Não eliminar um aviso essa regra se uma implementação de Dispose não telefonar GC.SuppressFinalize. Nessa situação, suprimir finalização degrada o desempenho e não fornecer nenhum benefícios.
Exemplo
O exemplo a seguir mostra um método que chama incorretamente GC.SuppressFinalize passando- true (True no Visual Basic).
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 chama corretamente 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
Tipos descartáveis devem declarar finalizador
Consulte também
Referência
Implementando Finalize e Dispose para Apagar up recursos não gerenciados