Freigeben über


CA1501: Übermäßige Vererbung vermeiden.

Eigenschaft Wert
Regel-ID CA1501
Titel Übermäßige Vererbung vermeiden.
Kategorie Wartbarkeit
Fix führt oder führt nicht zur Unterbrechung Breaking
Standardschwellenwert 5
Standardmäßig in .NET 9 aktiviert No

Ursache

Ein Typ befindet sich fünf oder mehr Ebenen tief in der Vererbungshierarchie.

Regelbeschreibung

Tief verschachtelte Typenhierarchien können schwer zu verfolgen, verstehen und verwalten sein. Diese Regel schränkt die Analyse auf Hierarchien im gleichen Modul ein.

Sie können diese Regel auf folgende Arten konfigurieren:

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, leiten Sie den Typ von einem Basistyp ab, der in der Vererbungshierarchie weniger tief ist, oder entfernen Sie einige der dazwischenliegenden Basistypen.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung von dieser Regel kann problemlos unterdrückt werden. Allerdings ist es möglicherweise schwieriger, den Code zu verwalten. Je nach Sichtbarkeit der Basistypen kann die Behebung von Verstößen gegen diese Regel Breaking Changes nach sich ziehen. Beispielsweise ist das Entfernen von öffentlichen Basistypen ein Breaking Change.

Hinweis

Möglicherweise werden falsch positive Warnungen von dieser Regel angezeigt, wenn alle der folgenden Punkte zutreffen:

  • Sie verwenden Visual Studio 2022, Version 17.5 oder höher, mit einer älteren Version des .NET SDK, d. h. .NET 6 oder früher.
  • Sie verwenden die Analysetools aus dem .NET 6 SDK oder einer älteren Version der Analysetoolpakete, z. B. Microsoft. CodeAnalysis.FxCopAnalyzers.

Die falsch positiven Warnungen sind auf einen Breaking Change im C#-Compiler zurückzuführen. Erwägen Sie die Verwendung von neueren Analysetools, die den Hotfix für falsch positive Warnungen enthalten. Führen Sie ein Upgrade auf Microsoft. CodeAnalysis.NetAnalyzers Version 7.0.0-preview1.22464.1 oder höher aus, oder verwenden Sie die Analysetools aus dem .NET 7 SDK.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Konfigurieren des Schwellenwerts

Sie können den Schwellenwert konfigurieren, bei dem diese Regel ausgelöst wird.

  1. Erstellen Sie eine Textdatei mit dem Namen CodeMetricsConfig.txt.

  2. Fügen Sie der Textdatei den gewünschten Schwellenwert im folgenden Format hinzu:

    CA1501: 8
    

    In diesem Beispiel ist die Regel so konfiguriert, dass sie ausgelöst wird, wenn ein Typ acht oder mehr Ebenen tief in der Vererbungshierarchie liegt.

  3. Markieren Sie in der Projektdatei die Buildaktion der Konfigurationsdatei als AdditionalFiles. Beispiel:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

Konfigurieren des zu analysierenden Codes

Mithilfe der folgenden Option können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.

Sie können diese Option nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Wartbarkeit) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.

Vererbung ausgeschlossene Typ- oder Namespace-Namen

Sie können die Regel so konfigurieren, dass bestimmte Typen oder Namespaces aus der Struktur der Vererbungshierarchie ausgeschlossen werden. Standardmäßig werden alle Typen aus dem System.*-Namespace ausgeschlossen. Unabhängig von dem Wert, den Sie festlegen, wird dieser Standardwert hinzugefügt.

Optionswert Zusammenfassung
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType Entspricht allen Typen mit dem Namen MyType oder deren enthaltender Namespace MyType enthält (und alle Typen aus dem System-Namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Entspricht allen Typen mit dem Namen MyType1 oder MyType2 deren enthaltender Namespace MyType1 oder MyType2 enthält (und alle Typen aus dem System-Namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Entspricht einem bestimmten Typ MyType im Namespace NS (und allen Typen aus dem System-Namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Stimmt mit bestimmten MyType1- und MyType2-Typen mit den entsprechenden vollqualifizierten Namen (und allen von System-Namespace) überein
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Entspricht allen Typen der NS-Namespace (und allen Typen aus dem System-Namespace).
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Entspricht allen Typen, deren Name mit My beginnt oder dessen enthaltende Namespace teilweise mit My (und allen Typen aus dem System-Namespace) beginnen
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Entspricht allen Typen, deren Name mit My im Namespace NS beginnt (und allen Typen aus dem System-Namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Entspricht allen Typen deren enthaltener Namespace mit My beginnt (und allen Typen aus dem System-Namespace)

Beispiel

Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt:

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