CA2216: Uvolnitelné typy by měly deklarovat finalizační metodu
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Kategorie |
Microsoft.Usage |
Narušující změna |
Nenarušující |
Příčina
Typ, který implementuje IDisposable a obsahuje pole, která navrhují použití nespravovaných zdrojů prostředky neimplementuje finalizační metodu jak je popsáno v Object.Finalize.
Popis pravidla
Porušení tohoto pravidla je oznámeno, pokud jednorázový typ obsahuje následující typy polí:
Jak vyřešit porušení
Porušení tohoto pravidla lze vyřešit implementací finalizační metody, která volá metodu Dispose.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění tohoto pravidla, pokud typ za účelem uvolnění nespravovaných prostředků neimplementuje IDisposable.
Příklad
Následující příklad ukazuje typ, který porušuje toto pravidlo.
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);
// }
}
}
Související pravidla
CA2115: Volejte GC.KeepAlive při použití nativních zdrojů
CA1816: Volejte správně GC.SuppressFinalize
CA1049: Typy, které vlastní nativní prostředky by měly být uvolnitelné