CA1501: избегайте излишнего наследования
Свойство | Значение |
---|---|
Идентификатор правила | CA1501 |
Заголовок | Избегайте излишнего наследования |
Категория | Ремонтопригодность |
Исправление является критическим или не критическим | Критическое |
Пороговое значение по умолчанию | 5 |
Включен по умолчанию в .NET 8 | No |
Причина
Тип составляет пять или более уровней в иерархии наследования.
Описание правила
Глубокие иерархии вложенных типов трудно отслеживать, понимать и поддерживать. Это правило ограничивает анализ иерархиями в одном модуле.
Это правило можно настроить следующим образом:
- По умолчанию правило исключает типы из
System
пространства имен. Правило можно настроить для исключения других типов или пространств имен. - Вы можете настроить глубину дерева наследования, с которой запускается это правило.
Устранение нарушений
Чтобы устранить нарушение этого правила, создайте производный тип от базового типа, который менее глубоко находится в иерархии наследования, или удалите некоторые из промежуточных базовых типов.
Когда лучше отключить предупреждения
Это безопасно для подавления предупреждения из этого правила. Однако это может усложнить обслуживание кода. В зависимости от видимости базовых типов разрешение нарушений этого правила может привести к критическим изменениям. Например, удаление открытых базовых типов является критическим изменением.
Примечание.
В этом правиле могут отображаться предупреждения о ложноположительных срабатываниях, если применяются все указанные ниже действия.
- Вы используете Visual Studio 2022 версии 17.5 или более поздней версии с более старой версией пакета SDK для .NET, то есть .NET 6 или более ранней версии.
- Вы используете анализаторы из пакета SDK для .NET 6 или более старой версии пакетов анализатора, например Microsoft.CodeAnalysis.FxCopAnalyzers.
Ложные срабатывания обусловлены критическим изменением компилятора C#. Рассмотрите возможность использования более нового анализатора, содержащего исправление для предупреждений ложноположительных срабатываний. Обновление до Microsoft.CodeAnalysis.NetAnalyzers версии 7.0.0-preview1.22464.1 или более поздней версии или использование анализаторов из пакета SDK для .NET 7.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка порогового значения
Пороговое значение, с помощью которого запускается это правило.
Создайте текстовый файл с именем CodeMetricsConfig.txt.
Добавьте требуемое пороговое значение в текстовый файл в следующем формате:
CA1501: 8
В этом примере правило настроено на срабатывание, если тип составляет восемь или более уровней в иерархии наследования.
В файле проекта пометьте действие сборки файла конфигурации как AdditionalFiles. Например:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (возможности обслуживания), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Наследование исключенных типов или имен пространств имен
Правило можно настроить для исключения определенных типов или пространств имен из дерева иерархии наследования. По умолчанию все типы из пространства имен System.*
исключаются. Независимо от заданного значения добавляется это значение по умолчанию.
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Соответствует всем типам с именем MyType или типам, пространство имен которых содержит MyType (и все типы из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Соответствует всем типам с именем MyType1 или MyType2 или типам, пространство имен которых содержит MyType1 или MyType2 (и все типы из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Соответствует определенному типу MyType в пространстве имен NS (и всем типам из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Соответствует конкретным типам MyType1 и MyType2 с соответствующими полными именами (и всем типам из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Соответствует всем типам из пространства имен NS (и всем типам из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Соответствует всем типам, имена которых начинаются с My или части пространства имен которых начинаются с My (и всем типам из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Соответствует всем типам, имена которых начинаются с My в пространстве имен NS (и всем типам из пространства имен System ) |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Соответствует всем типам, пространства имен которых начинаются с My (и всем типам из пространства имен System ) |
Пример
В следующем примере показан тип, нарушающий это правило:
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