Conjunto de reglas de análisis de código Reglas de corrección básica de Microsoft
El conjunto Reglas de corrección básica de Microsoft se centra en los errores lógicos y errores comunes común en el uso de las API de marco de trabajo. Este conjunto incluye las reglas del conjunto Reglas mínimas recomendadas de Microsoft. Para obtener más información, vea Conjunto de reglas de análisis de código Reglas mínimas recomendadas de Microsoft. Debe incluir este conjunto de reglas si desea expandir la lista de advertencias que presentan las reglas mínimas recomendadas.
En la tabla siguiente se describen todas las reglas del conjunto Reglas de corrección básica de Microsoft.
Regla |
Descripción |
---|---|
El valor predeterminado de una enumeración no inicializada, igual que otros tipos de valor, es cero. Una enumeración con atributo y sin marcadores debería definir un miembro con el valor de cero de modo que el valor predeterminado sea un valor válido de la enumeración. Si una enumeración a la que se le haya aplicado el atributo FlagsAttribute define un miembro con valor cero, su nombre debe ser "None" para indicar que no se han establecido valores en la enumeración. |
|
CA1013: El operador de sobrecarga es igual que la suma y resta de sobrecarga |
Un tipo público o protegido implementa los operadores de suma o resta sin implementar el operador de igualdad. |
Un método visible externamente pasa como parámetro un literal de cadena a un constructor o método de la biblioteca de clases de .NET Framework y esa cadena debe ser localizable. |
|
Las cadenas se deberían normalizar para que se escriban en letras mayúsculas. Hay un grupo pequeño de caracteres que no pueden realizar un viaje de ida y vuelta cuando se convierten a minúsculas. |
|
Se crea un nuevo objeto pero nunca se utiliza, o se llama a un método que crea y devuelve una nueva cadena y esta nunca se utiliza, o un método COM o P/Invoke devuelve un código de error o HRESULT que nunca se utiliza. |
|
Un método que es una implementación de Dispose no llama a GC.SuppressFinalize, o un método que no es una implementación de Dispose llama a GC.SuppressFinalize, o un método llama a GC.SuppressFinalize y pasa algo distinto de "this" (Me en Visual Basic). |
|
Las matrices devueltas por las propiedades no están protegidas contra escritura, aun cuando la propiedad es de sólo lectura. Para mantener la matriz inviolable, la propiedad debe devolver una copia de la matriz. Por lo general, los usuarios no entienden las implicaciones de rendimiento adversas que se originan al llamar a este tipo de propiedad. |
|
CA1820: Comprobar si las cadenas están vacías mediante la longitud de cadena |
El uso de la propiedad String.Length o del método String.IsNullOrEmpty para comparar cadenas es mucho más rápido que el uso de Equals. |
CA1903: Usar solo API de la versión de .NET Framework de destino |
Un miembro o tipo utiliza un miembro o tipo que se introdujo en un Service Pack no incluido en el marco de destino del proyecto. |
Al efectuar la conversión para utilizar SafeHandle, quite todas las llamadas a GC.KeepAlive (objeto). En este caso, las clases no deben tener que llamar a GC.KeepAlive, puesto que se supone que no tienen un finalizador sino que dependen de SafeHandle para que se encargue de finalizar el indicador OS. |
|
CA2006: Utilizar SafeHandle para encapsular recursos nativos |
El uso de IntPtr en código administrado podría indicar un posible problema para la seguridad y la confiabilidad. Todos los usos de IntPtr se deben revisar para determinar si se necesita utilizar en su lugar SafeHandle o una tecnología similar. |
CA2102: Detectar las excepciones que no son CLSCompliant en los controladores generales |
Un miembro de un ensamblado que no está marcado con el atributo RuntimeCompatibilityAttribute o está marcado con RuntimeCompatibility(WrapNonExceptionThrows = false) contiene un bloque catch que controla el objeto System.Exception y no contiene un bloque catch general inmediatamente después. |
CA2104: No declarar tipos de referencias mutables de solo lectura |
Un tipo visible externamente contiene un campo de sólo lectura visible externamente que es un tipo de referencia que se puede cambiar. Un tipo que mutable es un tipo cuyos datos de instancia se pueden modificar. |
CA2105: Los campos de matrices no deberían ser de solo lectura |
Cuando se aplica el modificador de solo lectura (ReadOnly en Visual Basic) a un campo que contiene una matriz, el campo no se puede modificar para hacer referencia a una matriz distinta. Sin embargo, se pueden cambiar los elementos de la matriz almacenados en un campo de sólo lectura. |
Un método valida un permiso y no se realiza ninguna comprobación de seguridad en el llamador. Validar un permiso de seguridad sin realizar ninguna comprobación de seguridad puede dejar una debilidad de seguridad explotable en el código. |
|
CA2115: Llamar a GC.KeepAlive cuando se utilicen recursos nativos |
Esta regla detecta errores que pueden haberse producido porque se finaliza un recurso no administrado mientras todavía se utiliza en código no administrado. |
CA2119: Sellar los métodos que cumplan las interfaces privadas |
Un tipo público heredable proporciona una implementación de método reemplazable de una interfaz interna (Friend en Visual Basic). Para corregir una infracción de esta regla, impida que el método sea reemplazado fuera del ensamblado. |
Este tipo tiene un constructor que toma un objeto System.Runtime.Serialization.SerializationInfo y un objeto System.Runtime.Serialization.StreamingContext (la firma del constructor de serialización). Una comprobación de seguridad no protege este constructor, pero protege uno o más constructores regulares del tipo. |
|
El sistema llama al constructor estático antes de crear la primera instancia del tipo o antes de hacer referencia a cualquier miembro estático. Si un constructor estático no es privado, se puede llamar a través de un código distinto del sistema. En función de las operaciones que se realizan en el constructor, esto puede producir un comportamiento inesperado. |
|
Se define un método de invocación de plataforma y hay un método con la funcionalidad equivalente en la biblioteca de clases de .NET Framework. |
|
CA2215: Los métodos Dispose deben llamar a Dispose de clase base |
Si un tipo hereda de un tipo descartable, debe llamar al método Dispose del tipo base desde su propio método Dispose. |
Los finalizadores deben utilizar el modificador de acceso de familia. |
|
No debería cambiar el modificador de acceso para los miembros heredados. Cambiando un miembro heredado a privado no evita que los llamadores tengan acceso a la implementación de la clase base del método. |
|
CA2223: Los miembros deben diferenciarse por algo más que por un tipo de valor devuelto |
Aunque Common Language Runtime permite utilizar tipos de valor devuelto para diferenciar miembros idénticos, esta característica no se encuentra en Common Language Specification ni es una característica común de los lenguajes de programación de .NET. |
CA2224: Reemplazar Equals al sobrecargar operadores de igualdad |
Un tipo público implementa el operador de igualdad, pero no reemplaza Object.Equals. |
Un tipo implementa el operador de igualdad o de desigualdad y no implementa el operador opuesto. |
|
CA2227: Las propiedades de la colección deben ser de solo lectura |
Una propiedad de colección grabable permite al usuario reemplazar la colección por otra diferente. Una propiedad de sólo lectura impide que la colección se reemplace, pero sí permite establecer miembros individuales. |
CA2231: Sobrecargar el operador de igualdad al reemplazar el tipo de valor de igualdad |
Un tipo de valor invalida Object.Equals pero no implementa el operador de igualdad. |
CA2239: Proporcionar métodos de deserialización para campos opcionales |
Un tipo tiene un campo que está marcado con el atributo System.Runtime.Serialization.OptionalFieldAttribute y el tipo no proporciona métodos de control de eventos de deserialización. |