Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Propriedade | valor |
|---|---|
| ID da regra | CA1501 |
| Título | Evite heranças excessivas |
| Categoria | Manutenibilidade |
| A correção causa interrupção ou não | Interrupção |
| Limiar predefinido | 5 |
| Habilitado por padrão no .NET 10 | Não |
| Línguas aplicáveis | C# e Visual Basic |
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
Systemnamespace. 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 base públicos é uma alteração significativa.
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 alteração incompatível no compilador C#. Considere utilizar um analisador mais recente que inclua a correção para os alertas 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: 8Neste 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.
Nomes de tipo ou 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 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 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 nomeados como 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 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 específicos MyType1 e MyType2, com os respetivos nomes totalmente qualificados, e a todos os tipos do espaço de nomes System. |
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