CA2215: Metody Dispose by měly volat uvolnění třídy Base

Vlastnost Hodnota
ID pravidla CA2215
Název Metody Dispose by měly volat uvolnění základní třídy
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Typ, který implementuje System.IDisposable dědí z typu, který také implementuje IDisposable. Metoda Dispose zděděného typu nevolá Dispose metodu nadřazeného typu.

Popis pravidla

Pokud typ dědí z uvolnitelného typu, musí volat Dispose metodu základního typu z vlastní Dispose metody. Volání metody základního typu Dispose zajišťuje uvolnění všech prostředků vytvořených základním typem.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, zavolejte baseDispose v metoděDispose.

Kdy potlačit upozornění

Upozornění z tohoto pravidla je bezpečné potlačit, pokud se volání baseDispose vyskytuje na hlubší úrovni volání, než kontroluje pravidlo.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující příklad ukazuje dva typy, TypeA které implementuje IDisposablea TypeB které dědí z typu TypeA a správně volá jeho Dispose metodu.

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

Viz také