CA1501: Vermijd overmatige overname
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1501 |
Titel | Vermijd overmatige overname |
Categorie | Onderhoudbaarheid |
Oplossing is brekend of niet-brekend | Breken |
Standaarddrempelwaarde | 5 |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een type is vijf of meer niveaus diep in de overnamehiërarchie.
Beschrijving van regel
Diep geneste typehiërarchieën kunnen moeilijk te volgen, begrijpen en onderhouden zijn. Met deze regel wordt de analyse beperkt tot hiërarchieën in dezelfde module.
U kunt deze regel op de volgende manieren configureren:
- De regel sluit standaard typen uit van de
System
naamruimte. U kunt de regel configureren om ook andere typen of naamruimten uit te sluiten. - U kunt de diepte van de overnamestructuur configureren waarop deze regel wordt geactiveerd.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, moet u het type afleiden van een basistype dat minder diep in de overnamehiërarchie ligt of enkele van de tussenliggende basistypen elimineren.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken. Het kan echter lastiger zijn om de code te onderhouden. Afhankelijk van de zichtbaarheid van basistypen kan het oplossen van schendingen van deze regel fouten veroorzaken. Het verwijderen van openbare basistypen is bijvoorbeeld een belangrijke wijziging.
Notitie
U ziet mogelijk fout-positieve waarschuwingen van deze regel als alle volgende van toepassing zijn:
- U gebruikt Visual Studio 2022 versie 17.5 of hoger met een oudere versie van de .NET SDK, dat wil zeggen .NET 6 of eerder.
- U gebruikt de analyses van de .NET 6 SDK of een oudere versie van de analysepakketten, zoals Microsoft.CodeAnalysis.FxCopAnalyzers.
De fout-positieven zijn te wijten aan een wijziging die fouten veroorzaakt in de C#-compiler. Overweeg om een nieuwere analyse te gebruiken die de oplossing voor de fout-positieve waarschuwingen bevat. Voer een upgrade uit naar Microsoft.CodeAnalysis.NetAnalyzers versie 7.0.0-preview1.22464.1 of hoger of gebruik de analyses van de .NET 7 SDK.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Drempelwaarde configureren
U kunt de drempelwaarde configureren waarop deze regel wordt geactiveerd.
Maak een tekstbestand met de naam CodeMetricsConfig.txt.
Voeg de gewenste drempelwaarde toe aan het tekstbestand in de volgende indeling:
CA1501: 8
In dit voorbeeld is de regel zo geconfigureerd dat deze wordt geactiveerd wanneer een type acht of meer niveaus diep in de overnamehiërarchie heeft.
Markeer in het projectbestand de buildactie van het configuratiebestand als AdditionalFiles. Voorbeeld:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (onderhoudbaarheid) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Uitgesloten overnametype- of naamruimtenamen
U kunt de regel configureren om bepaalde typen of naamruimten uit te sluiten van de overnamehiërarchiestructuur. Standaard worden alle typen van de System.*
naamruimte uitgesloten. Ongeacht de waarde die u instelt, wordt deze standaardwaarde toegevoegd.
Optiewaarde | Samenvatting |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Komt overeen met alle typen met de naam MyType of waarvan de naamruimte de naamruimte bevat MyType (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Komt overeen met alle typen met de naam MyType1 of MyType2 waarvan de naamruimte een of MyType2 MyType1 (en alle typen uit de System naamruimte) bevat. |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Komt overeen met een specifiek type MyType in de naamruimte NS (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Komt overeen met specifieke typen MyType1 en MyType2 met respectieve volledig gekwalificeerde namen (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Komt overeen met alle typen uit de NS naamruimte (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Komt overeen met alle typen waarvan de naam begint met My of waarvan de naamruimteonderdelen beginnen met My (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Komt overeen met My alle typen waarvan de naam begint in de naamruimte NS (en alle typen uit de System naamruimte) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Komt overeen met My alle typen waarvan de naamruimte begint (en alle typen uit de System naamruimte) |
Opmerking
In het volgende voorbeeld ziet u een type dat de regel schendt:
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