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:
- Por padrão, a regra exclui tipos do
System
namespace. Você também pode configurar a regra para excluir outros tipos ou namespaces . - Você pode configurar a profundidade da árvore de herança na qual essa regra é acionada.
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.
Crie um arquivo de texto chamado CodeMetricsConfig.txt.
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.
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