CA1501: Vyhněte se nadměrné dědičnosti
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1501 |
Název | Vyhněte se nadměrné dědičnosti |
Kategorie | Udržovatelnost |
Oprava způsobující chybu nebo chybu způsobující chybu | Narušující |
Výchozí prahová hodnota | 5 |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
Typ je v hierarchii dědičnosti pět nebo více úrovní.
Popis pravidla
Hluboce vnořené hierarchie typů může být obtížné sledovat, pochopit a udržovat. Toto pravidlo omezuje analýzu na hierarchie ve stejném modulu.
Toto pravidlo můžete nakonfigurovat následujícími způsoby:
- Ve výchozím nastavení pravidlo vylučuje typy z
System
oboru názvů. Pravidlo můžete nakonfigurovat tak, aby vyloučilo i jiné typy nebo obory názvů. - Můžete nakonfigurovat hloubku stromu dědičnosti, ve které se toto pravidlo aktivuje.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, odvodit typ ze základního typu, který je méně hluboko v hierarchii dědičnosti nebo eliminovat některé z mezilehlých základních typů.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění z tohoto pravidla. Údržba kódu ale může být obtížnější. V závislosti na viditelnosti základníchtypůchch Odebráním veřejných základních typů je například zásadní změna.
Poznámka:
Falešně pozitivní upozornění z tohoto pravidla se můžou zobrazit, pokud platí všechny tyto skutečnosti:
- Používáte Sadu Visual Studio 2022 verze 17.5 nebo novější se starší verzí sady .NET SDK, tj. .NET 6 nebo starší.
- Používáte analyzátory ze sady .NET 6 SDK nebo starší verze balíčků analyzátoru, například Microsoft.CodeAnalysis.FxCopAnalyzers.
Falešně pozitivní výsledky jsou způsobeny zásadní změnou kompilátoru jazyka C#. Zvažte použití novějšího analyzátoru, který obsahuje opravu falešně pozitivních upozornění. Upgradujte na Microsoft.CodeAnalysis.NetAnalyzers verze 7.0.0-preview1.22464.1 nebo novější nebo použijte analyzátory ze sady .NET 7 SDK.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Konfigurace prahové hodnoty
Můžete nakonfigurovat prahovou hodnotu, pro kterou se toto pravidlo aktivuje.
Vytvořte textový soubor s názvem CodeMetricsConfig.txt.
Do textového souboru přidejte požadovanou prahovou hodnotu v následujícím formátu:
CA1501: 8
V tomto příkladu se pravidlo nakonfiguruje tak, aby se aktivovalo, když je typ v hierarchii dědičnosti osm nebo více úrovní.
V souboru projektu označte akci sestavení konfiguračního souboru jako AdditionalFiles. Příklad:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Konfigurace kódu pro analýzu
Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.
Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (udržovatelnost), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Vyloučený typ nebo názvy oborů názvů dědičnosti
Pravidlo můžete nakonfigurovat tak, aby z stromu hierarchie dědičnosti vyloučilo určité typy nebo obory názvů. Ve výchozím nastavení jsou vyloučeny všechny typy z System.*
oboru názvů. Bez ohledu na to, jakou hodnotu nastavíte, se tato výchozí hodnota přidá.
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Porovná všechny typy pojmenované MyType nebo obsahující obor názvů MyType (a všechny typy z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Porovná všechny typy pojmenované buď MyType1 nebo MyType2 jejichž obsahující obor názvů obsahuje buď MyType1 nebo MyType2 (a všechny typy z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Odpovídá určitému typu MyType v oboru názvů NS (a všechny typy z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Odpovídá konkrétním typům MyType1 a MyType2 příslušným plně kvalifikovaným názvům (a všem typům System z oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Odpovídá všem typům NS z oboru názvů (a všech typů z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Odpovídá všem typům My , jejichž název začíná nebo jehož obsahující části oboru názvů začínají My (a všechny typy z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Odpovídá všem typům, jejichž název začíná My v oboru názvů NS (a všechny typy z System oboru názvů). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Odpovídá všem typům, jejichž obor názvů obsahuje My (a všechny typy z System oboru názvů) |
Příklad
Následující příklad ukazuje typ, který porušuje pravidlo:
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