CA2216: Verwerfbare Typen sollten einen Finalizer deklarieren
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Kategorie (Category) |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Typ, der IDisposable implementiert und Felder besitzt, bei denen die Verwendung nicht verwalteter Ressourcen empfohlen wird, implementiert keinen Finalizer wie von Object.Finalize beschrieben.
Regelbeschreibung
Ein Verstoß gegen diese Regel wird gemeldet, wenn der verwerfbare Typ Felder folgender Typen enthält:
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie einen Finalizer, der die Dispose-Methode aufruft.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn der Typ nicht IDisposable implementiert, um nicht verwaltete Ressourcen freizugeben.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt.
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);
// }
}
}
Verwandte Regeln
CA2115: GC.KeepAlive beim Verwenden systemeigener Ressourcen aufrufen
CA1816: GC.SuppressFinalize korrekt aufrufen
CA1049: Typen, die systemeigene Ressourcen besitzen, müssen gelöscht werden können