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:

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.

  1. Cree un archivo de texto denominado CodeMetricsConfig.txt.

  2. 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.

  3. 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