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