Share via


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.

  1. Maak een tekstbestand met de naam CodeMetricsConfig.txt.

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

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