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:

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.

  1. Vytvořte textový soubor s názvem CodeMetricsConfig.txt.

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

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