Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA2215 |
| Titel | Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen |
| Categorie | Gebruik |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Nee |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Een type dat System.IDisposable implementeert, erft van een type dat ook IDisposable implementeert. De Dispose methode van het overnemende type roept de Dispose methode van het bovenliggende type niet aan.
Beschrijving van regel
Als een type erft van een verwijderbaar type, moet het de Dispose-methode van het basistype aanroepen vanuit zijn eigen Dispose-methode. Als u de methode basistype Dispose aanroept, zorgt u ervoor dat alle resources die door het basistype zijn gemaakt, worden vrijgegeven.
Hoe schendingen op te lossen
Als u een schending van deze regel wilt oplossen, roept u basein 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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.
Voorbeeld
In het volgende voorbeeld ziet u twee typen, TypeA die IDisposable implementeert, en TypeB die erft van het type TypeA en de methode Dispose correct aanroept.
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);
}
}
}
}