Comparteix a través de


CA2215: Los métodos Dispose deben llamar al método Dispose de la clase base

Propiedad Value
Identificador de la regla CA2215
Título Los métodos Dispose deben llamar al método Dispose de la clase base
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 9 No

Causa

Un tipo que implementa System.IDisposable hereda de un tipo que también implementa IDisposable. El método Dispose del tipo heredado no llama al método Dispose del tipo principal.

Descripción de la regla

Si un tipo se hereda de un tipo descartable, debe llamar al método Dispose del tipo base desde su propio método Dispose. La llamada al método Dispose de tipo base garantiza que se liberen los recursos creados por el tipo base.

Cómo corregir infracciones

Para corregir una infracción de esta regla, llama a base.Disposeen tu método Dispose.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si la llamada a base.Dispose se produce en un nivel de llamada más profundo que las comprobaciones de regla.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el ejemplo siguiente se muestran dos tipos, TypeA que implementa IDisposable y TypeB que hereda del tipo TypeA y llama correctamente a su método 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);
            }
        }
    }
}

Consulte también