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