Partilhar via


CA1501: Evite herança excessiva

Property valor
ID da regra CA1501
Título Evite heranças excessivas
Categoria Manutenibilidade
A correção está quebrando ou não quebrando Quebrando
Limiar por defeito 5
Habilitado por padrão no .NET 9 Não

Motivo

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

Descrição da regra

Hierarquias de tipo profundamente aninhadas podem ser difíceis de seguir, entender 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 que seja menos profundo na hierarquia de herança ou elimine alguns dos tipos de 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 de base, a resolução de violações dessa regra pode criar alterações de quebra. Por exemplo, remover tipos de base pública é uma mudança de rutura.

Nota

Poderá ver avisos falsos positivos desta regra se se aplicarem todas as seguintes condições:

  • 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 devidos a uma mudança de quebra no compilador C#. Considere o uso de 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

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Configurar limite

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

  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 é 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 análise

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

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

Tipo excluído por herança ou nomes de namespace

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 System.* namespace são excluídos. Não importa o valor definido, esse valor padrão é adicionado.

Valor da opção Resumo
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType Corresponde a todos os tipos nomeados MyType ou cujo namespace MyType contém (e todos os tipos do System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Corresponde a todos os tipos nomeados ou MyType1 MyType2 cujo namespace que contém contém ou MyType1 MyType2 (e todos os tipos do System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Corresponde ao tipo MyType específico no namespace NS (e todos os tipos do System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Corresponde a tipos MyType1 específicos e MyType2 com os respetivos nomes totalmente qualificados (e todos os tipos do System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Corresponde a todos os tipos do NS namespace (e todos os tipos do System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Corresponde a todos os tipos cujo nome começa com My ou cujas partes de namespace que contêm começa com My (e todos os tipos do System namespace)
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 System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Corresponde a todos os tipos cujo namespace que contém começa com My (e todos os tipos do System namespace)

Exemplo

O exemplo a seguir 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