CA2215 : Les méthodes Dispose doivent appeler la méthode Dispose de la classe de base
Propriété | Value |
---|---|
Identificateur de la règle | CA2215 |
Titre | Les méthodes Dispose doivent appeler la méthode Dispose de la classe de base |
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 hérite d’un type qui implémente également IDisposable. La méthode Dispose du type hérité n’appelle pas la méthode Dispose du type parent.
Description de la règle
Si un type hérite d’un type supprimable, il doit appeler la méthode Dispose du type de base à partir de sa propre méthode Dispose. L’appel de la méthode Dispose
du type de base garantit que toutes les ressources créées par le type de base sont libérées.
Comment corriger les violations
Pour corriger une violation de cette règle, appelez base
.Dispose dans votre méthode Dispose.
Quand supprimer les avertissements
Vous pouvez sans risque supprimer un avertissement de cette règle si l’appel à base
.Dispose se produit à un niveau d’appel plus profond que celui vérifié par la règle.
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 CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
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.CA2215.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemple
L’exemple suivant montre deux types, TypeA
qui implémente IDisposable, et TypeB
qui hérite du type TypeA
et appelle correctement sa méthode Dispose.
Namespace ca2215
Public Class TypeA
Implements IDisposable
Protected Overridable Overloads Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
End If
' free native resources
End Sub
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
' Disposable types implement a finalizer.
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
End Class
Public Class TypeB
Inherits TypeA
Protected Overrides Sub Dispose(disposing As Boolean)
If Not disposing Then
MyBase.Dispose(False)
End If
End Sub
End Class
End Namespace
using System;
namespace ca2215
{
public class TypeA : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose managed resources
}
// Free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Disposable types implement a finalizer.
~TypeA()
{
Dispose(false);
}
}
public class TypeB : TypeA
{
protected override void Dispose(bool disposing)
{
if (!disposing)
{
base.Dispose(false);
}
}
}
}