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:
- Por padrão, a regra exclui tipos do namespace
System
. 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 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.
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 está 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 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