CA2216: Engångstyper bör deklarera finalator
Property | Värde |
---|---|
Regel-ID | CA2216 |
Title | Engångstyper bör deklarera finalizer |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En typ som implementerar System.IDisposable, och har fält som tyder på användning av ohanterade resurser, implementerar inte en finalizer enligt beskrivningen i System.Object.Finalize.
Regelbeskrivning
En överträdelse av den här regeln rapporteras om engångstypen innehåller fält av följande typer:
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln implementerar du en finalator som anropar din Dispose metod.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om typen inte implementeras IDisposable i syfte att frigöra ohanterade resurser.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
I följande exempel visas en typ som bryter mot den här regeln.
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);
// }
}
Relaterade regler
CA1816: Ring GC. SuppressFinalize korrekt