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 9 | 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