CA1012: Абстрактные типы не должны иметь открытые конструкторы
Свойство | Значение |
---|---|
Идентификатор правила | CA1012 |
Заголовок | Абстрактные типы не должны иметь открытых конструкторов |
Категория | Проектирование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Тип является абстрактным и имеет открытый конструктор.
По умолчанию это правило проверяет только видимые извне типы, но это поведение можно настроить.
Описание правила
Конструкторы абстрактных типов могут быть вызваны только производными типами. Открытые конструкторы создают экземпляры типа. Невозможно создавать экземпляры абстрактного типа; абстрактный тип с открытым конструктором является недопустимым.
Устранение нарушений
Чтобы устранить нарушение этого правила, либо сделайте конструктор защищенным, либо не объявляйте тип как абстрактный.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует. Абстрактный тип имеет открытый конструктор.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1012
// The code that's violating the rule is on this line.
#pragma warning restore CA1012
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1012.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (конструкторе), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включение определенных контактных зон API
Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Пример
Следующий фрагмент кода содержит абстрактный тип, нарушающий это правило.
' Violates this rule
Public MustInherit Class Book
Public Sub New()
End Sub
End Class
// Violates this rule
public abstract class Book
{
public Book()
{
}
}
Следующий фрагмент кода устраняет предыдущее нарушение, изменяя доступность конструктора с public
на protected
.
// Does not violate this rule
public abstract class Book
{
protected Book()
{
}
}
' Violates this rule
Public MustInherit Class Book
Protected Sub New()
End Sub
End Class