CA1047: No declarar miembros protegidos en tipos sellados

Propiedad Value
Identificador de la regla CA1047
Título No declarar miembros protegidos en tipos sellados
Categoría Diseño
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un tipo público es sealed (NotInheritable en Visual Basic) y declara un miembro protegido o un tipo anidado protegido. Esta regla no notifica las infracciones de los métodos Finalize, que deben seguir este patrón.

Descripción de la regla

Los tipos declaran miembros protegidos para que los tipos heredados puedan obtener acceso o reemplazar el miembro. Por definición, no se puede heredar de un tipo sellado, lo que significa que no se puede llamar a los métodos protegidos en tipos sellados.

El compilador de C# emite la advertencia CS0628 en lugar de CA1047 para esta situación.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el nivel de acceso del miembro a privado o haga que el tipo sea heredable.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla. Si se deja el tipo en su estado actual, se pueden producir problemas de mantenimiento y no aporta ninguna ventaja.

Configuración del código para analizar

Use la opción siguiente para configurar en qué partes del código base ejecutar esta regla.

Puede configurar esta opción solo para esta regla, para todas las reglas a las que se aplica o para todas las reglas de esta categoría (Diseño) a las que se aplica. Para más información, vea Opciones de configuración de reglas de calidad de código.

Incluir superficies de API específicas

Puede configurar en qué partes del código base ejecutar esta regla, en función de su accesibilidad. Por ejemplo, para especificar que la regla solo se debe ejecutar en la superficie de API no públicas, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Ejemplo

En el ejemplo siguiente se muestra un tipo que infringe esta regla.

public sealed class SealedClass
{
    protected void ProtectedMethod(){}
}
Public NotInheritable Class BadSealedType
    Protected  Sub MyMethod
    End Sub
End Class