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