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

CA1801: Revise os parâmetros não utilizados

CA1804: Remover locals não utilizados