CA1816: Chame GC.SuppressFinalize corretamente

TypeName

CallGCSuppressFinalizeCorrectly

CheckId

CA1816

<strong>Categoria</strong>

Microsoft. Uso

Alteração significativa

Não separável

Causa

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