Partilhar via


CA1049: Os tipos que possuem recursos nativos devem ser descartáveis

TypeName

TypesThatOwnNativeResourcesShouldBeDisposable

CheckId

CA1049

Category (Categoria)

Microsoft.Design

Alteração Significativa

Sem quebra

Causa

Um tipo referencia um campo System.IntPtr, um campo System.UIntPtr, ou um campo System.Runtime.InteropServices.HandleRef, mas não implementa System.IDisposable.

Descrição da Regra

Esta regra pressupõe que os campos IntPtr, UIntPtr, e HandleRef armazenam ponteiros para recursos não gerenciados.Tipos que alocam recursos não gerenciados devem implementar IDisposable para permitir que os chamadores liberem esses recursos sob demanda e reduzam o tempo de vida dos objetos que contêm os recursos.

O padrão de design recomendado para limpar recursos não gerenciados é fornecer tanto meio implícito quanto explícito para liberar esses recursos usando o método Object.Finalize e o método IDisposable.Dispose, respectivamente.O coletor de lixo chama o método Finalize de um objeto em algum tempo indeterminado depois que o objeto é determinado já não ser mais alcançável.Depois que o Finalize é chamado, uma coleta de lixo adicional é necessária para liberar o objeto.O método Dispose permite que o chamador libere explicitamente os recursos sob demanda, antes que os recursos sejam liberados se deixados ao coletor de lixo.Depois de limpar os recursos não gerenciados, Dispose deve chamar o método GC.SuppressFinalize para permitir que o coletor de lixo saiba que o Finalize não mais tem que ser chamado; isso elimina a necessidade de coleta de lixo extra e diminui a vida útil do objeto.

Como Corrigir Violações

Para corrigir uma violação desta regra, implemente IDisposable.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra se o tipo não referencia um recurso não gerenciado.Caso contrário, não elimine um aviso desta regra porque a falha para implementar IDisposable pode fazer com que os recursos não gerenciados se tornem indisponíveis ou subutilizados.

Exemplo

O exemplo a seguir mostra um tipo que implementa IDisposable para limpar um recurso não gerenciado.

Imports System

Namespace DesignLibrary

    Public Class UnmanagedResources
        Implements IDisposable

       Dim unmanagedResource As IntPtr
       Dim disposed As Boolean = False

       Sub New 
           ' Allocate the unmanaged resource ...
       End Sub

       Overloads Sub Dispose() Implements IDisposable.Dispose
           Dispose(True)
           GC.SuppressFinalize(Me)
       End Sub

       Protected Overloads Overridable Sub Dispose(disposing As Boolean)
           If Not(disposed) Then

               If(disposing) Then
                   ' Release managed resources.
               End If

               ' Free the unmanaged resource ...

               unmanagedResource = IntPtr.Zero

               disposed = True

           End If
       End Sub

       Protected Overrides Sub Finalize()
           Dispose(False)
       End Sub

    End Class

End Namespace
using System;

namespace DesignLibrary
{
    public class UnmanagedResources : IDisposable
    {
        IntPtr unmanagedResource;
        bool disposed = false;

        public UnmanagedResources() 
        {
            // Allocate the unmanaged resource ...
        }

        public void Dispose() 
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }

        protected virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                    // Release managed resources.
                }

                // Free the unmanaged resource ...

                unmanagedResource = IntPtr.Zero;

                disposed = true;
            }
        }

        ~UnmanagedResources()
        {
            Dispose(false);
        }
    }
}

Regras Relacionadas

CA2115: Chama GC.Ao usar os recursos nativos de KeepAlive

CA1816: Chama GC.SuppressFinalize corretamente

CA2216: Tipos descartáveis devem declarar o finalizador

CA1001: Os tipos que possuem campos descartáveis devem ser descartáveis

Consulte também

Referência

Implementing Finalize and Dispose to Clean Up Unmanaged Resources

Outros recursos

Limpeza de recursos não gerenciados