Share via


CA1501: Undvik överdrivet arv

Property Värde
Regel-ID CA1501
Title Undvik överdrivet arv
Kategori Underhåll
Korrigeringen är icke-bakåtkompatibel Bryta
Standardtröskelvärde 5
Aktiverad som standard i .NET 8 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.

  1. Skapa en textfil med namnet CodeMetricsConfig.txt.

  2. 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.

  3. 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