Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA1501 |
| Tytuł | Unikaj nadmiernego dziedziczenia |
| Kategoria | Łatwość konserwacji |
| Poprawka łamiąca lub nienaruszająca | Przełomowe |
| Domyślny próg | 5 |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Typ znajduje się na poziomie piątym lub głębszym w hierarchii dziedziczenia.
Opis reguły
Hierarchie typów głęboko zagnieżdżonych mogą być trudne do śledzenia, zrozumienia i utrzymania. Ta reguła ogranicza analizę do hierarchii w tym samym module.
Tę regułę można skonfigurować w następujący sposób:
- Domyślnie reguła wyklucza typy z
Systemprzestrzeni nazw. Regułę można również skonfigurować tak, aby wykluczała inne typy nazw lub przestrzenie nazw. - Możesz skonfigurować głębokość drzewa dziedziczenia, w której jest uruchamiana ta reguła.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy utworzyć typ z typu podstawowego, który jest mniej głęboki w hierarchii dziedziczenia lub wyeliminować niektóre typy bazowe pośrednie.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły. Jednak kod może być trudniejszy do utrzymania. W zależności od widoczności typów bazowych rozwiązywanie naruszeń tej reguły może spowodować powstanie zmian powodujących niezgodność. Na przykład usunięcie typów baz publicznych jest zmianą powodującą niezgodność.
Uwaga
Jeśli wszystkie następujące elementy mają zastosowanie, mogą pojawić się ostrzeżenia fałszywie dodatnie z tej reguły:
- Używasz programu Visual Studio 2022 w wersji 17.5 lub nowszej ze starszą wersją zestawu .NET SDK, czyli platformą .NET 6 lub starszą.
- Używasz analizatorów z zestawu .NET 6 SDK lub starszej wersji pakietów analizatora, takich jak Microsoft.CodeAnalysis.FxCopAnalyzers.
Wyniki fałszywie dodatnie są spowodowane zmianą powodującą niezgodność w kompilatorze języka C#. Rozważ użycie nowszego analizatora zawierającego poprawkę dla ostrzeżeń fałszywie dodatnich. Przeprowadź uaktualnienie do wersji Microsoft.CodeAnalysis.NetAnalyzers w wersji 7.0.0-preview1.22464.1 lub nowszej lub użyj analizatorów z zestawu .NET 7 SDK.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie progu
Można skonfigurować próg, przy którym jest uruchamiana ta reguła.
Utwórz plik tekstowy o nazwie CodeMetricsConfig.txt.
Dodaj żądany próg do pliku tekstowego w następującym formacie:
CA1501: 8W tym przykładzie reguła ma się uruchamiać, gdy typ ma osiem lub więcej poziomów w głąb swojej hierarchii dziedziczenia.
W pliku projektu oznacz akcję kompilacji pliku konfiguracji jako AdditionalFiles. Na przykład:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Konfigurowanie kodu do analizowania
Użyj następującej opcji, aby skonfigurować, które części kodu mają być objęte tą regułą.
Tę opcję można skonfigurować tylko dla tej reguły, dla wszystkich reguł, do których ma ona zastosowanie, lub dla wszystkich reguł w tej kategorii (możliwość konserwacji), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Dziedziczenie wykluczonych typów lub nazw przestrzeni nazw
Regułę można skonfigurować tak, aby wykluczyć niektóre typy lub przestrzenie nazw z drzewa hierarchii dziedziczenia. Domyślnie wszystkie typy z System.* przestrzeni nazw są wykluczone. Bez względu na to, jaka wartość jest ustawiona, ta wartość domyślna jest dodawana.
| Wartość opcji | Podsumowanie |
|---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Dopasuje wszystkie typy o nazwie MyType lub, których przestrzeń nazw zawiera MyType (i wszystkie typy z przestrzeni nazw System) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Pasuje do wszystkich typów o nazwie MyType1 lub MyType2 lub których przestrzeń nazw zawiera MyType1 lub MyType2 (i wszystkie typy z przestrzeni nazw System) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Pasuje do określonego typu MyType w przestrzeni nazw NS (i wszystkie typy z przestrzeni nazw System) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Dopasowuje określone typy MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami (oraz wszystkie typy z przestrzeni nazw System) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Pasuje do wszystkich typów z NS przestrzeni nazw (i wszystkich typów z System przestrzeni nazw) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Pasuje do wszystkich typów, których nazwa zaczyna się od My lub których części przestrzeni nazw zaczynają się od My (oraz wszystkie typy z przestrzeni nazw System). |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Pasuje do wszystkich typów, których nazwa zaczyna się od My w przestrzeni nazw NS (i wszystkich typów z System przestrzeni nazw) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Pasuje do wszystkich typów, których przestrzeń nazw zaczyna się od My (oraz wszystkich typów z przestrzeni nazw System). |
Przykład
W poniższym przykładzie pokazano typ naruszający regułę:
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