Udostępnij za pośrednictwem


CA2215: Metody Dispose powinny wywoływać operację usuwania klasy bazowej

Właściwości Wartość
Identyfikator reguły CA2215
Tytuł Metody Dispose powinny wywoływać metodę Dispose klasy bazowej
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Typ implementujący System.IDisposable dziedziczy z typu, który implementuje IDisposablerównież element . Dispose Metoda typu dziedziczonego nie wywołuje Dispose metody typu nadrzędnego.

Opis reguły

Jeśli typ dziedziczy z typu jednorazowego, musi wywołać Dispose metodę typu podstawowego z własnej Dispose metody. Wywołanie metody typu Dispose podstawowego gwarantuje, że wszystkie zasoby utworzone przez typ podstawowy zostaną zwolnione.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, wywołaj metodę base.Dispose Dispose

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli wywołanie metody base.Dispose występuje na wyższym poziomie wywołania niż sprawdza reguła.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

W poniższym przykładzie przedstawiono dwa typy, TypeA które implementują IDisposablemetodę , i TypeB dziedziczą po typie TypeA i poprawnie wywołuje metodę 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);
            }
        }
    }
}

Zobacz też