CA1812: evitar classes internas sem instâncias
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Categoria |
Microsoft.Performance |
Alteração Significativa |
Sem quebra |
Causa
Uma instância de um tipo de nível de assembly não é criada pelo código no assembly.
Descrição da Regra
Esta regra tenta localizar uma chamada a um dos construtores do tipo, e também fornece uma violação se nenhum chamada é encontrado.
Os seguintes tipos não são verificados por essa regra:
Tipos de valor
Tipos de sumário
Enumerações
Delegados
Tipos de matriz completo emitidos
Tipos que não podem ser instanciados e que define métodos de static (Shared no Visual Basic).
Se você aplicar InternalsVisibleToAttribute o assembly que está sendo analisado, esta regra não ocorrerá nos construtores marcados como internal porque você não pode definir se um campo está sendo usado por outro assembly de friend .
Mesmo que você não possa solucionar essa limitação na análise de código de Visual Studio , o FxCop autônoma externo ocorrerá construtores internos se cada assembly de friend estiver presente na análise.
Como Corrigir Violações
Para corrigir uma violação desta regra, remova o tipo ou adicione o código que o usa.Se o tipo contém apenas métodos estáticos, adicione o seguinte ao tipo para impedir que o compilador emite um construtor público padrão da instância:
Um construtor particular para os tipos que têm as versões 1,0 e 1,1 de .NET Framework .
O modificador de static (Shared no Visual Basic) para tipos que têm .NET Framework 2,0.
Quando Suprimir Alertas
É seguro suprimir um aviso desta regra.Recomendamos que você elimina esse aviso nas seguintes situações:
A classe é criada com os métodos de reflexão de associação tardia como CreateInstance.
A classe é criada automaticamente pelo tempo de execução ou por ASP.NET.Por exemplo, classes que implementam IConfigurationSectionHandler ou IHttpHandler.
A classe é passado como um parâmetro de tipo genérico que tem uma nova restrição.Por exemplo, o exemplo gerará esta regra.
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();
Nessas situações, recomendamos que suprimimos esse aviso.
Regras Relacionadas
CA1811: evitar código privado não chamado