Compartir a través de


Evitar las clases internas sin instancia

Actualización: noviembre 2007

Nombre de tipo

AvoidUninstantiatedInternalClasses

Identificador de comprobación

CA1812

Categoría

Microsoft.Performance

Cambio problemático

No 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 para los que no se pueden crear instancias y definen únicamente métodos static.

Si aplica System.Runtime.CompilerServices.InternalsVisibleToAttribute al ensamblado que se está analizando, esta regla no desencadenará 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 desencadenará 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 para 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.

  • El motor en tiempo de ejecución o ASP.NET crean automáticamente la clase. Por ejemplo, las clases que implementan System.Configuration.IConfigurationSectionHandler o System.Web.IHttpHandler.

  • La clase se pasa como un parámetro de tipo genérico con una nueva restricción. Por ejemplo, el ejemplo siguiente desencadenará 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

Evitar código privado al que no se llama

Revisar los parámetros sin utilizar

Eliminar variables locales no utilizadas