CA2216: Typy usuwalne powinny deklarować finalizator
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ, który implementuje IDisposable i zawiera pola, które sugerują wykorzystania zasobów niezarządzanych, nie implementuje finalizatora jako opisano w Object.Finalize.
Opis reguły
Naruszenie tej zasady jest raportowane, jeśli typ usuwalny zawiera pola następujących typów:
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaimplementować finalizator, który wywołują metodę Dispose.
Kiedy pomijać ostrzeżenia
Można pominąć ostrzeżenia od tej reguły, jeśli typ nie implementuje IDisposable do zwalniania niezarządzanych zasobów.
Przykład
Poniższy przykład pokazuje typ, który narusza regułę.
using System;
using System.Runtime.InteropServices;
namespace UsageLibrary
{
public class DisposeMissingFinalize :IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
}
Powiązane reguły
CA2115: Wywołaj GC.KeepAlive gdy używasz zasobów natywnych
CA1816: Wywołaj poprawnie GC.SuppressFinalize
CA1049: Typy, które posiadają natywne zasoby powinny być usuwalne