Поделиться через


CA1812: не создавайте внутренние классы без экземпляров

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

Причина

Экземпляр внутреннего типа (уровня сборки) никогда не создается.

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

Это правило пытается найти вызов одного из конструкторов типа и сообщает о нарушении, если вызов не найден.

Это правило не проверяет следующие типы.

  • Типы значений
  • Абстрактные типы
  • Перечисления
  • Делегаты
  • Типы массивов, созданные компилятором
  • Типы, которые не могут быть созданы и определяют static только методы.

Если вы применяете System.Runtime.CompilerServices.InternalsVisibleToAttribute к сборке, которая анализируется, это правило не помечает типы, помеченные как internal (Friend в Visual Basic), по умолчанию, так как поле может использоваться дружественной сборкой. Чтобы проанализировать сборку, см. статью "Настройка кода для анализа".

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

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

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

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

  • Класс создается с помощью методов отражения с поздним связыванием, таких как System.Activator.CreateInstance.

  • Класс регистрируется в контейнере инверсии управления как часть шаблона внедрения зависимостей.

  • Класс создается автоматически средой выполнения или ASP.NET. Примерами автоматически создаваемых классов являются классы, реализующие System.Configuration.IConfigurationSectionHandler или System.Web.IHttpHandler.

  • Класс используется в качестве параметра типа в определении класса и имеет new ограничение. Следующий пример будет помечен правилом CA1812:

    internal class MyClass
    {
        public void DoSomething()
        {
        }
    }
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();
        }
    }
    
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none

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

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

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

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

Игнорировать атрибут InternalsVisibleTo

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

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Этот параметр доступен начиная с .NET 8.