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


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

TypeName

AvoidUninstantiatedInternalClasses

CheckId

CA1812

Категория

Microsoft.Performance

Критическое изменение

Не критическое

Причина

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

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

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

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

  • типы значений;

  • Абстрактные типы

  • Перечисления

  • Делегаты

  • Типы массивов, определяемые компилятором

  • Типы, для которых не могут быть созданы экземпляры и которые определяют только методы static (Shared в Visual Basic).

Если к анализируемой сборке применяется System.Runtime.CompilerServices.InternalsVisibleToAttribute, данное правило не будет выполнено для всех конструкторов, помеченных как internal, поскольку нельзя сообщить, что поле используется другой сборкой friend.

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

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

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

  • Закрытый конструктор для типов, используемых в версиях 1.0 и 1.1 .NET Framework.

  • Модификатор static (Shared в Visual Basic) для типов, предназначенных для .NET Framework 2.0.

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

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

  • Класс создается посредством поздней привязки методов отражения, например CreateInstance.

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

  • Класс передается в виде параметра универсального типа с новым ограничением.Например, в следующем примере показано выполнение правила.

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

В этих случаях рекомендуется отключить предупреждение.

Связанные правила

CA1811: не используйте невызываемый закрытый код

CA1801: проверьте неиспользуемые параметры

CA1804: удалите неиспользуемые локальные переменные