CA1501: Evitar herança excessiva

Property Valor
ID da regra CA1501
Título Evitar herança excessiva
Categoria Facilidade de manutenção
Correção interruptiva ou sem interrupção Quebra
Limite padrão 5
Habilitado por padrão no .NET 8 Não

Causa

Um tipo tem cinco ou mais níveis de profundidade em sua hierarquia de herança.

Descrição da regra

As hierarquias de tipo profundamente aninhado podem ser difíceis de seguir, compreender e manter. Esta regra limita a análise a hierarquias no mesmo módulo.

Você pode configurar essa regra das seguintes maneiras:

Como corrigir violações

Para corrigir uma violação dessa regra, derive o tipo de um tipo base menos profundo na hierarquia de herança ou elimine alguns dos tipos base intermediários.

Quando suprimir avisos

É seguro suprimir um aviso desta regra. No entanto, o código pode ser mais difícil de manter. Dependendo da visibilidade dos tipos básicos, a resolução de violações dessa regra pode criar alterações importantes. Por exemplo, a remoção de tipos base públicos é uma alteração interruptiva.

Observação

Você pode ver avisos de falsos positivos desta regra se todos os itens a seguir se aplicarem:

  • Você está usando o Visual Studio 2022 versão 17.5 ou posterior com uma versão mais antiga do SDK do .NET, ou seja, .NET 6 ou anterior.
  • Você está usando os analisadores do SDK do .NET 6 ou uma versão mais antiga dos pacotes do analisador, como Microsoft. CodeAnalysis.FxCopAnalyzers.

Os falsos positivos são devido a uma alteração interruptiva no compilador de C#. Considere usar um analisador mais recente que contenha a correção para os avisos de falsos positivos. Atualize para Microsoft. CodeAnalysis.NetAnalyzers versão 7.0.0-preview1.22464.1 ou mais recente, ou use os analisadores do SDK do .NET 7.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Configurar limite

Você pode configurar o limite no qual essa regra é disparada.

  1. Crie um arquivo de texto chamado CodeMetricsConfig.txt.

  2. Adicione o limite desejado ao arquivo de texto no seguinte formato:

    CA1501: 8
    

    Neste exemplo, a regra está configurada para ser acionada quando um tipo tem oito ou mais níveis de profundidade em sua hierarquia de herança.

  3. No arquivo de projeto, marque a ação de compilação do arquivo de configuração como AdditionalFiles. Por exemplo:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

Configurar código para analisar

Use a opção a seguir para configurar em quais partes da base de código essa regra deve ser executada.

Você pode configurar essa opção apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Capacidade de manutenção) às quais ela se aplica. Para mais informações, consulte opções de configuração de regra de qualidade de código.

Tipos ou nomes de namespace excluídos por herança

Você pode configurar a regra para excluir determinados tipos ou namespaces da árvore de hierarquia de herança. Por padrão, todos os tipos do namespace System.* são excluídos. Independentemente do valor definido, esse valor padrão é adicionado.

Valor de Opção Resumo
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType Corresponde a todos os tipos chamados MyType ou cujo namespace contém MyType (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Corresponde a todos os tipos denominados MyType1 ou MyType2, ou cujo namespace contém MyType1 ou MyType2 (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Corresponde ao tipo específico MyType no namespace NS (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Corresponde a tipos específicos MyType1 e MyType2 com os respectivos nomes totalmente qualificados (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Corresponde a todos os tipos do namespace NS (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Corresponde a todos os tipos cujo nome começa com My ou cujas partes do namespace começam com My (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Corresponde a todos os tipos cujo nome começa com My no namespace NS (e todos os tipos do namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Corresponde a todos os tipos cujo namespace contido começa com My (e todos os tipos do namespace System)

Exemplo

O seguinte exemplo mostra um tipo que viola a regra:

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