CA2215: Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen

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

Zie ook