Создавать внутренние классы
Обновлен: Ноябрь 2007
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Категория |
Microsoft.Performance |
Критическое изменение |
Не критическое |
Причина
Экземпляр типа уровня сборки не создан кодом в сборке.
Описание правила
Попытка найти вызов одного из конструкторов типа заканчивается неудачей и приводит к нарушению правила.
Данное правило не проверяет следующие типы.
Типы значений
Абстрактные типы
Перечисления
Делегаты
Типы массивов, определяемые компилятором
Типы, которые не могут быть созданы и определяют только методы static.
Если к анализируемой сборке применяется System.Runtime.CompilerServices.InternalsVisibleToAttribute, данное правило не будет выполнено для всех конструкторов, помеченных как internal, поскольку нельзя сообщить, что поле используется другой сборкой friend.
Даже если это ограничение не удается устранить в средстве анализа кода Visual Studio, внешний автономный инструмент FxCop будет активирован во внутренних конструкторах при наличии в анализе сборки friend.
Устранение нарушений
Чтобы устранить нарушение данного правила, удалите тип или добавьте код, который его использует. Если тип содержит только статические методы, для предотвращения создания компилятором экземпляра открытого конструктора по умолчанию нужно добавить один из следующих типов.
Закрытый конструктор для типов, используемых в версиях 1.0 и 1.1 .NET Framework.
Модификатор static для типов, предназначенных .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();
В этих случаях рекомендуется отключить предупреждение.
Связанные правила
Не используйте невызываемые private коды