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