Share via


CA2215: Kassera metoder ska anropa basklassens bortskaffning

Property Värde
Regel-ID CA2215
Rubrik Kassera metoder bör anropa basklassens bortskaffning
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En typ som implementerar System.IDisposable ärver från en typ som även implementerar IDisposable. Metoden Dispose för ärvningstypen anropar inte metoden för den Dispose överordnade typen.

Regelbeskrivning

Om en typ ärver från en engångstyp måste den Dispose anropa metoden för bastypen inifrån sin egen Dispose metod. Genom att anropa bastypsmetoden Dispose ser du till att alla resurser som skapas av bastypen släpps.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln anropar du base.Dispose i din Dispose metod.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om anropet till base.Dispose inträffar på en djupare anropsnivå än regeln kontrollerar.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

I följande exempel visas två typer, TypeA som implementerar IDisposable, och TypeB som ärver från typen TypeA och anropar dess Dispose metod korrekt.

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

Se även