CA1501: Evitar una herencia excesiva
Propiedad | Value |
---|---|
Identificador de la regla | CA1501 |
Título | Evitar una herencia excesiva |
Categoría | Capacidad de mantenimiento |
La corrección es problemática o no problemática | Problemático |
Umbral predeterminado | 5 |
Habilitado de forma predeterminada en .NET 8 | No |
Causa
Un tipo tiene cinco niveles o más de profundidad en su jerarquía de herencia.
Descripción de la regla
Las jerarquías de tipos con demasiados niveles de anidación pueden resultar difíciles de seguir, comprender y mantener. Esta regla limita el análisis a las jerarquías en el mismo módulo.
Puede configurar esta regla de las siguientes maneras:
- De forma predeterminada, la regla excluye tipos del espacio de nombres
System
. También puede configurar la regla para excluir otros tipos o espacios de nombres. - Puede configurar la profundidad del árbol de herencia en la que se desencadena esta regla.
Cómo corregir infracciones
Para corregir una infracción de esta regla, derive el tipo de un tipo base que sea menos profundo en la jerarquía de herencia o elimine algunos de los tipos base intermedios.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla. Sin embargo, el código puede ser más difícil de mantener. En función de la visibilidad de los tipos base, la resolución de infracciones de esta regla podría crear cambios importantes. Por ejemplo, la eliminación de tipos base públicos es un cambio importante.
Nota
Es posible que vea advertencias de falsos positivos de esta regla si se aplica todo lo siguiente:
- Está usando Visual Studio 2022, versión 17.5 o posterior, con una versión anterior del SDK de .NET, es decir, .NET 6 o una anterior.
- Está usando los analizadores del SDK de .NET 6 o una versión anterior de los paquetes del analizador, como Microsoft.CodeAnalysis.FxCopAnalyzers.
Los falsos positivos se deben a un cambio importante en el compilador de C#. Considere la posibilidad de usar un analizador más reciente que incluya la corrección de las advertencias de falsos positivos. Actualice a Microsoft.CodeAnalysis.NetAnalyzers, versión 7.0.0-preview1.22464.1 o posterior, o bien use los analizadores del SDK de .NET 7.
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 CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
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.CA1501.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Configuración del umbral
Puede configurar el umbral en el que se activa esta regla.
Cree un archivo de texto denominado CodeMetricsConfig.txt.
Agregue el umbral deseado al archivo de texto con el formato siguiente:
CA1501: 8
En este ejemplo, la regla se configura para activarse cuando un tipo tiene ocho o más niveles de profundidad en su jerarquía de herencia.
En el archivo del proyecto, marque la acción de compilación del archivo de configuración como AdditionalFiles. Por ejemplo:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
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 (Mantenimiento) a las que se aplica. Para más información, vea Opciones de configuración de reglas de calidad de código.
Nombres de espacios de nombres o tipos excluidos de herencia
Puede configurar la regla para excluir determinados tipos o espacios de nombres del árbol de jerarquía de herencia. De forma predeterminada, se excluyen todos los tipos del espacio de nombres System.*
. Independientemente del valor que establezca, se agrega este valor predeterminado.
Valor de la opción | Resumen |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Coincide con todos los tipos denominados MyType o cuyo espacio de nombres contenedor contiene MyType (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Coincide con todos los tipos denominados MyType1 o MyType2 , o bien cuyo espacio de nombres contenedor contiene MyType1 o MyType2 (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Coincide con un tipo específico MyType en el espacio de nombres NS (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Coincide con los tipos específicos MyType1 y MyType2 con sus respectivos nombres completos (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Coincide con todos los tipos del espacio de nombres NS (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Coincide con todos los tipos cuyo nombre comienza por My o cuyas partes de espacio de nombres contenedores empiezan por My (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Coincide con todos los tipos cuyo nombre empiece por My en el espacio de nombres NS (y todos los tipos del espacio de nombres System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Coincide con todos los tipos cuyo espacio de nombres contenedor empieza por My (y todos los tipos del espacio de nombres System ) |
Ejemplo
En el ejemplo siguiente se muestra un tipo que infringe la regla:
class BaseClass {}
class FirstDerivedClass : BaseClass {}
class SecondDerivedClass : FirstDerivedClass {}
class ThirdDerivedClass : SecondDerivedClass {}
class FourthDerivedClass : ThirdDerivedClass {}
// This class violates the rule.
class FifthDerivedClass : FourthDerivedClass {}
Imports System
Namespace ca1501
Class BaseClass
End Class
Class FirstDerivedClass
Inherits BaseClass
End Class
Class SecondDerivedClass
Inherits FirstDerivedClass
End Class
Class ThirdDerivedClass
Inherits SecondDerivedClass
End Class
Class FourthDerivedClass
Inherits ThirdDerivedClass
End Class
' This class violates the rule.
Class FifthDerivedClass
Inherits FourthDerivedClass
End Class
End Namespace