Compartilhar via


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

TypeName

TypesThatOwnNativeResourcesShouldBeDisposable

CheckId

CA1049

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável

Causa

Faz referência a um tipo de um System.IntPtr campo, um System.UIntPtr campo, ou um System.Runtime.InteropServices.HandleRef campo, mas não não implementa System.IDisposable.

Descrição da regra

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

O padrão de design recomendado para limpar os recursos não gerenciados é fornecer um implícito e meios explícito para liberar esses recursos usando o Object.Finalize método e a IDisposable.Dispose método, respectivamente. As chamadas de coletor de lixo do Finalize método de um objeto em algum momento indeterminado após o objeto é determinado como não alcançável. Depois de Finalize é chamado, um adicional de coleta de lixo é necessária para liberar o objeto. O Dispose método permite que o chamador explicitamente liberar recursos sob demanda, mais cedo do que os recursos seriam liberados se deixada para o coletor de lixo. Depois que ele limpa os recursos não gerenciados, Dispose deve chamar o GC.SuppressFinalize método para permitir que o coletor de lixo saiba que Finalize não tem mais a ser chamado; Isso elimina a necessidade da coleta de lixo adicionais e diminui o tempo de vida do objeto.

Como corrigir violações

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

Quando suprimir avisos

É seguro eliminar um aviso esta regra se o tipo não faz referência a um recurso não gerenciado. Caso contrário, não eliminar um aviso esta regra porque falha para implementar IDisposable pode fazer com que os recursos não gerenciados se torne indisponível ou subutilizados.

Exemplo

O exemplo a seguir mostra um tipo que implementa IDisposable para limpar o 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: Chame GC.Ao usar os recursos nativos de KeepAlive

CA1816: Chame 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

Implementando finalizar e Dispose para limpeza de recursos não gerenciados

Outros recursos

Limpeza de recursos não gerenciados