CA1047: не объявляйте защищенные элементы в запечатанных типах

Свойство Значение
Идентификатор правила CA1047
Заголовок Не объявляйте защищенные члены в запечатанных типах
Категория Проектирование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Общедоступный тип sealed (NotInheritable в Visual Basic) объявляет защищенный элемент или защищенный вложенный тип. Это правило не сообщает о нарушениях для методов Finalize, которые должны следовать этому шаблону.

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

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

Компилятор C# выдает предупреждение CS0628 вместо CA1047 для этой ситуации.

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

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

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

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

Настройка кода для анализа

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

Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (конструкторе), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включение определенных контактных зон API

Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Пример

В следующем примере показан тип, нарушающий это правило.

public sealed class SealedClass
{
    protected void ProtectedMethod(){}
}
Public NotInheritable Class BadSealedType
    Protected  Sub MyMethod
    End Sub
End Class