Compartir a través de


CA1812: Evitar las clases internas sin instancia

TypeName

AvoidUninstantiatedInternalClasses

Identificador de comprobación

CA1812

Categoría

Microsoft.Performance

Cambio problemático

Poco problemático

Motivo

El código del ensamblado no crea una instancia del tipo del nivel de ensamblado.

Descripción de la regla

Esta regla intenta buscar una llamada a uno de los constructores del tipo, y crea un informe sobre una infracción si no se encuentra ninguna llamada.

Esta regla no examina los siguientes tipos:

  • Tipos de valor

  • Tipos abstractos

  • Enumeraciones

  • Delegados

  • Tipos de matriz emitidos por el compilador

  • Tipos de los que no se pueden crear instancias y que solo definen métodos estáticos static (Shared en Visual Basic).

Si aplica InternalsVisibleToAttribute al ensamblado que se está analizando, esta regla no ocurrirá en los constructores marcados como internal porque no se puede saber si otro ensamblado de friend está utilizando un campo.

Aunque no se pueda evitar esta limitación en el análisis de código de Visual Studio, el FxCop independiente externo se producirá en constructores internos si cada ensamblado friend se encuentra en el análisis.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el tipo o agregue el código que lo utiliza.Si el tipo sólo contiene métodos estáticos, agregue uno de los siguientes al tipo para evitar que el compilador emita un constructor de instancia público predeterminado:

  • Un constructor privado para tipos diseñados para las versiones 1.0 y 1.1 de .NET Framework.

  • El modificador static (Shared en Visual Basic) de los tipos diseñados para .NET Framework 2,0.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla.Recomendamos que suprima esta advertencia en las situaciones siguientes:

  • La clase se crea a través de métodos de reflexión enlazados en tiempo de ejecución, como CreateInstance.

  • La clase se crea automáticamente por el runtime o ASP.NET.Por ejemplo, las clases que implementan IConfigurationSectionHandler o IHttpHandler.

  • La clase se pasa como un parámetro de tipo genérico que tiene una nueva restricción.Por ejemplo, el ejemplo siguiente provocará esta regla:

    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();
    

En estas situaciones, recomendamos que suprima esta advertencia.

Reglas relacionadas

CA1811: Evitar código privado al que no se llama

CA1801: Revisar parámetros sin utilizar

CA1804: Quitar variables locales no utilizadas