Delen via


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 8 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 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 Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeeld

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

Zie ook