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