CA2216 : Les types pouvant être supprimés doivent déclarer un finaliseur
Propriété | Value |
---|---|
Identificateur de la règle | CA2216 |
Titre | Les types pouvant être supprimés doivent déclarer un finaliseur |
Catégorie | Utilisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Un type qui implémente System.IDisposable et présente des champs qui suggèrent l’utilisation de ressources non managées, n’implémente pas de finaliseur conforme à la description de System.Object.Finalize.
Description de la règle
Une violation de cette règle est signalée si le type pouvant être supprimé contient des champs des types suivants :
Comment corriger les violations
Pour corriger une violation de cette règle, implémentez un finaliseur qui appelle votre méthode Dispose.
Quand supprimer les avertissements
Vous pouvez supprimer un avertissement lié à cette règle en toute sécurité si le type n’implémente pas IDisposable dans le but de libérer des ressources non managées.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemple
L’exemple suivant montre un type qui enfreint cette règle.
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);
// }
}
Règles associées
CA1816 : Appeler GC.SuppressFinalize correctement