CA2215: Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2215 |
Titel | Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een type dat wordt geïmplementeerd System.IDisposable , neemt over van een type dat ook wordt geïmplementeerd IDisposable. De Dispose methode van het overnemende type roept de Dispose methode van het bovenliggende type niet aan.
Beschrijving van regel
Als een type overneemt van een wegwerptype, moet het de Dispose methode van het basistype aanroepen vanuit een eigen Dispose methode. Als u de methode basistype Dispose
aanroept, zorgt u ervoor dat alle resources die door het basistype zijn gemaakt, worden vrijgegeven.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, roept u base
in uw Dispose methode aanDispose.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als de aanroep naar base
.Dispose plaatsvindt op een dieper aanroepniveau dan de regelcontroles.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Opmerking
In het volgende voorbeeld ziet u twee typen, TypeA
die worden geïmplementeerd IDisposableen TypeB
die worden overgenomen van het type TypeA
en de methode correct aanroept 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);
}
}
}
}