Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1501 |
| Заголовок | Избегайте излишнего наследования |
| Категория | Ремонтопригодность |
| Исправление является критическим или не критическим | Срочное |
| Пороговое значение по умолчанию | 5 |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Тип содержит пять или более уровней в иерархии наследования.
Описание правила
Глубокие иерархии вложенных типов трудно отслеживать, понимать и поддерживать. Это правило ограничивает анализ иерархиями в одном модуле.
Это правило можно настроить следующим образом:
- По умолчанию правило исключает типы из
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