Megosztás a következőn keresztül:


CA1501: A túlzott öröklés elkerülése

Tulajdonság Érték
Szabályazonosító CA1501
Cím Kerülje a túlzott öröklést
Kategória Fenntarthatóság
A javítás kompatibilitástörő vagy nem törik Törés
Alapértelmezett küszöbérték 5
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

Egy típus öt vagy több szintből áll az öröklési hierarchiában.

Szabály leírása

A mélyen beágyazott típushierarchiák nehezen követhetők, értelmezhetők és karbantarthatók. Ez a szabály az ugyanazon modulban lévő hierarchiákra korlátozza az elemzést.

Ezt a szabályt a következő módokon konfigurálhatja:

Szabálysértések kijavítása

A szabály megsértésének kijavításához a típust olyan alaptípusból származtathatja, amely kevésbé mély az öröklési hierarchiában, vagy megszünteti a köztes alaptípusok némelyikét.

Mikor kell letiltani a figyelmeztetéseket?

Nyugodtan el lehet tiltani a szabály figyelmeztetését. A kód azonban nehezebben karbantartható. Az alaptípusok láthatóságától függően a szabály megsértéseinek feloldása kompatibilitástörő változásokat eredményezhet. A nyilvános alaptípusok eltávolítása például kompatibilitástörő változás.

Feljegyzés

Ha az alábbiak mindegyike érvényes, a szabály tévesen pozitív figyelmeztetéseket jeleníthet meg:

  • A Visual Studio 2022 17.5-ös vagy újabb verzióját használja a .NET SDK egy régebbi verziójával, vagyis a .NET 6-os vagy korábbi verziójával.
  • A .NET 6 SDK-ból származó elemzőket vagy az elemzőcsomagok egy régebbi verzióját használja, például a Microsoft.CodeAnalysis.FxCopAnalyzerst.

A hamis pozitív értékek a C#-fordító kompatibilitástörő változásának köszönhetők. Fontolja meg egy újabb elemző használatát, amely tartalmazza a hamis pozitív figyelmeztetések javítását. Frissítsen a Microsoft.CodeAnalysis.NetAnalyzers 7.0.0-preview1.22464.1-es vagy újabb verziójára, vagy használja a .NET 7 SDK elemzőit.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Küszöbérték konfigurálása

Konfigurálhatja azt a küszöbértéket, amelynél a szabály kigyullad.

  1. Hozzon létre egy CodeMetricsConfig.txt nevű szövegfájlt.

  2. Adja hozzá a kívánt küszöbértéket a szövegfájlhoz a következő formátumban:

    CA1501: 8
    

    Ebben a példában a szabály úgy van konfigurálva, hogy kigyulladjon, ha egy típus nyolc vagy több szinttel mélyebb az öröklési hierarchiában.

  3. A projektfájlban jelölje meg a konfigurációs fájl buildelési műveletét AdditionalFilesként. Példa:

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

Kód konfigurálása elemzéshez

A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Ezt a beállítást konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Karbantarthatóság), amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.

Öröklés kizárt típus- vagy névtérnevek

A szabály konfigurálható úgy, hogy bizonyos típusokat vagy névtereket kizárjon az öröklési hierarchia fájából. Alapértelmezés szerint a System.* névtér összes típusa ki van zárva. A beállított értéktől függetlenül ez az alapértelmezett érték lesz hozzáadva.

Beállítás értéke Összegzés
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType Megegyezik az összes névtérrel vagy MyType névtérrel MyType rendelkező típussal (és a System névtér összes típusával)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Egyezik az összes névtérrel vagy MyType1MyType2 névtérrel MyType1MyType2 vagy (és a System névtér összes típusával)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Egyezik a névtér NS adott típusával MyType (és a System névtér összes típusával)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Egyezik az adott típusokkal MyType1 és MyType2 a megfelelő teljes névvel (és a System névtér összes típusával)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Megfelel a névtér összes típusának NS (és a névtér összes típusának System )
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Megegyezik az összes olyan típussal, amelynek a neve a névtérrészekkel My kezdődik vagy a névtérrészeket tartalmazza (és a System névtérből származó összes típust My )
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Megegyezik az összes olyan típussal My , amelynek a neve a névtérben NS kezdődik (és a System névtér összes típusával)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Megegyezik az összes olyan típussal, amelynek névtere a névtérrel My kezdődik (és a System névtér összes típusával)

Példa

Az alábbi példa egy szabályt sértő típust mutat be:

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