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);
    // }
}

CA1816 : Appeler GC.SuppressFinalize correctement

Voir aussi