CA1812: Evite sem instância classes internas
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
<strong>Categoria</strong> |
Microsoft.Performance |
Alteração significativa |
Não-separável |
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 para um dos construtores do tipo e reporta uma violação se nenhuma chamada for encontrada.
Os seguintes tipos de não são examinados por esta regra:
Tipos de valor
Tipos abstratos
Enumerações
Delegados
Tipos de matriz emitida por compilador
Tipos que não pode ser instanciada e que definem static (Shared em Visual Basic) apenas métodos.
Se você aplicar System.Runtime.CompilerServices.InternalsVisibleToAttribute para o assembly que está sendo analisado a essa regra não ocorrerá em qualquer construtores estão marcados como internal porque não é possível dizer se um campo que está sendo usado por outro friend assembly.
Mesmo que você não pode contornar essa limitação na Visual Studio a análise de código, o FxCop independente externo ocorrerão nos construtores internos se cada friend assembly está presente na análise.
Como corrigir violações
Para corrigir uma violação desta regra, remover o tipo ou adicione o código que o utiliza. Se o tipo contém apenas os métodos estáticos, adicione um dos seguintes para o tipo para impedir que o compilador emitindo um construtor de instância pública padrão:
Um construtor particular para tipos de destino .NET Framework versões 1.0 e 1.1.
O static (Shared em Visual Basic) modificador para tipos de destino .NET Framework 2.0.
Quando suprimir avisos
É seguro eliminar um aviso esta regra. Recomendamos que você suprimir esse aviso nas seguintes situações:
A classe é criada por meio de métodos de reflexão de ligação tardia, como CreateInstance.
A classe é criada automaticamente pelo tempo de execução ou ASP.NET. Por exemplo, classes que implementam System.Configuration.IConfigurationSectionHandler ou System.Web.IHttpHandler.
A classe é passada como um parâmetro de tipo genérico que tem uma nova restrição. Por exemplo, o exemplo a seguir irá disparar a essa 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, é recomendável que você suprimir esse aviso.
Regras relacionadas
CA1811: Evite código privado de uncalled