Compartilhar via


CA1049: tipos que tenham recursos nativos devem ser descartáveis

TypeName

TypesThatOwnNativeResourcesShouldBeDisposable

CheckId

CA1049

Categoria

Microsoft.Design

Alteração Significativa

Sem quebra

Causa

Um tipo referencia um campo IntPtr, um campo UIntPtr, ou um campo HandleRef, mas não implementa 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: chamar GC.KeepAlive durante o uso de recursos nativos

CA1816: chamar GC.SuppressFinalize corretamente

CA2216: os tipos descartáveis devem declarar o finalizador

CA1001: tipos que tenham campos descartáveis devem ser descartáveis

Consulte também

Outros recursos

Limpando recursos não gerenciados

Implementing Finalize and Dispose to Clean Up Unmanaged Resources