CA2215: Metody Dispose by měly volat metodu uvolnění základní třídy

Vlastnost Hodnota
ID pravidla CA2215
Název Metody Dispose by měly volat Dispose základní třídy.
Kategorie Využití
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

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 ve vaší metodě Dispose.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, pokud k volání baseDispose dojde na hlubší úrovni, než jakou pravidlo kontroluje.

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é