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 8 aktiviert | Nein |
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:
- Standardmäßig schließt die Regel Typen aus dem Namespace
System
aus. Sie können die Regel so konfigurieren, dass sie auch andere Typen oder Namespaces ausschließt. - Sie können die Vererbungsstrukturtiefe konfigurieren, bei der diese Regel ausgelöst wird.
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.
Erstellen Sie eine Textdatei mit dem Namen CodeMetricsConfig.txt.
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.
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