CA1501: избегайте излишнего наследования

Свойство Значение
Идентификатор правила CA1501
Заголовок Избегайте излишнего наследования
Категория Ремонтопригодность
Исправление является критическим или не критическим Критическое
Пороговое значение по умолчанию 5
Включен по умолчанию в .NET 8 No

Причина

Тип составляет пять или более уровней в иерархии наследования.

Описание правила

Глубокие иерархии вложенных типов трудно отслеживать, понимать и поддерживать. Это правило ограничивает анализ иерархиями в одном модуле.

Это правило можно настроить следующим образом:

Устранение нарушений

Чтобы устранить нарушение этого правила, создайте производный тип от базового типа, который менее глубоко находится в иерархии наследования, или удалите некоторые из промежуточных базовых типов.

Когда лучше отключить предупреждения

Это безопасно для подавления предупреждения из этого правила. Однако это может усложнить обслуживание кода. В зависимости от видимости базовых типов разрешение нарушений этого правила может привести к критическим изменениям. Например, удаление открытых базовых типов является критическим изменением.

Примечание.

В этом правиле могут отображаться предупреждения о ложноположительных срабатываниях, если применяются все указанные ниже действия.

  • Вы используете 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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка порогового значения

Пороговое значение, с помощью которого запускается это правило.

  1. Создайте текстовый файл с именем CodeMetricsConfig.txt.

  2. Добавьте требуемое пороговое значение в текстовый файл в следующем формате:

    CA1501: 8
    

    В этом примере правило настроено на срабатывание, если тип составляет восемь или более уровней в иерархии наследования.

  3. В файле проекта пометьте действие сборки файла конфигурации как 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