Compartilhar via


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

CA1801: revisar parâmetros não usados

CA1804: remover locais não usados