CA1501: Undvik överdrivet arv
Property | Värde |
---|---|
Regel-ID | CA1501 |
Title | Undvik överdrivet arv |
Kategori | Underhåll |
Korrigeringen är icke-bakåtkompatibel | Brott |
Standardtröskelvärde | 5 |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En typ är fem eller flera nivåer djupt i arvshierarkin.
Regelbeskrivning
Djupt kapslade typhierarkier kan vara svåra att följa, förstå och underhålla. Den här regeln begränsar analys till hierarkier i samma modul.
Du kan konfigurera den här regeln på följande sätt:
- Regeln exkluderar som standard typer från
System
namnområdet. Du kan också konfigurera regeln så att den undantar andra typer eller namnområden. - Du kan konfigurera det arvsträdsdjup där den här regeln utlöses.
Så här åtgärdar du överträdelser
Åtgärda ett brott mot den här regeln genom att härleda typen från en bastyp som är mindre djup i arvshierarkin eller eliminera några av de mellanliggande bastyperna.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln. Koden kan dock vara svårare att underhålla. Beroende på bastypernas synlighet kan det skapa icke-bakåtkompatibla ändringar om du löser överträdelser av den här regeln. Att till exempel ta bort offentliga bastyper är en icke-bakåtkompatibel ändring.
Kommentar
Du kan se falska positiva varningar från den här regeln om alla följande gäller:
- Du använder Visual Studio 2022 version 17.5 eller senare med en äldre version av .NET SDK, dvs. .NET 6 eller tidigare.
- Du använder analysverktygen från .NET 6 SDK eller en äldre version av analyspaketen, till exempel Microsoft.CodeAnalysis.FxCopAnalyzers.
Falska positiva identifieringar beror på en icke-bakåtkompatibel ändring i C#-kompilatorn. Överväg att använda en nyare analysator som innehåller korrigeringen för falska positiva varningar. Uppgradera till Microsoft.CodeAnalysis.NetAnalyzers version 7.0.0-preview1.22464.1 eller senare eller använd analysverktygen från .NET 7 SDK.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera tröskelvärde
Du kan konfigurera tröskelvärdet som den här regeln utlöses vid.
Skapa en textfil med namnet CodeMetricsConfig.txt.
Lägg till det önskade tröskelvärdet i textfilen i följande format:
CA1501: 8
I det här exemplet konfigureras regeln att utlösas när en typ är åtta eller fler nivåer djupt i arvshierarkin.
Markera konfigurationsfilens byggåtgärd som AdditionalFiles i projektfilen. Till exempel:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som det gäller för eller för alla regler i den här kategorin (underhållsbarhet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Arvs exkluderad typ eller namnområdesnamn
Du kan konfigurera regeln för att undanta vissa typer eller namnområden från arvshierarkiträdet. Som standard undantas alla typer från System.*
namnområdet. Oavsett vilket värde du anger läggs det här standardvärdet till.
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Matchar alla typer med namnet MyType eller vars namnområde innehåller MyType (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 vars innehållande namnområde innehåller antingen MyType1 eller MyType2 (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Matchar specifik typ MyType i namnområdet NS (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Matchar alla typer från NS namnområdet (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Matchar alla typer vars namn börjar med My eller vars innehållande namnområdesdelar börjar med My (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Matchar alla typer vars namn börjar med My i namnområdet NS (och alla typer från System namnområdet) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Matchar alla typer vars namnområde börjar med My (och alla typer från System namnområdet) |
Exempel
I följande exempel visas en typ som bryter mot regeln:
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