Reglas de calidad del código

El análisis de código de .NET proporciona reglas que pretenden mejorar la calidad del código. Las reglas se organizan en áreas como las de diseño, globalización, rendimiento y seguridad. Algunas reglas son específicas del uso de la API de .NET, mientras que otras son sobre la calidad del código genérico.

Índice de reglas

En la tabla siguiente se enumeran las reglas de análisis de calidad del código.

Id. de regla y advertencia Descripción
CA1000: No declarar miembros estáticos en tipos genéricos Cuando se llama a un miembro estático de un tipo genérico, se debe especificar el argumento de tipo correspondiente a ese tipo. Cuando se llama a un miembro de instancia genérico que no admite la interferencia, se debe especificar el argumento de tipo para el miembro. En estos dos casos, la sintaxis para especificar el argumento de tipo es diferente y resulta fácil confundirse.
CA1001: Los tipos que poseen campos descartables deben ser descartables Una clase declara e implementa un campo de instancia que es de tipo System.IDisposable y la clase no implementa IDisposable. Una clase que declara un campo IDisposable posee indirectamente un recurso no administrado y debería implementar la interfaz IDisposable.
CA1002: No exponer listas genéricas System.Collections.Generic.List<(Of <(T>)>) es una colección genérica diseñada para el rendimiento, no para la herencia. Por consiguiente, List no contiene ningún miembro virtual. En su lugar, se debe exponer las colecciones genéricas diseñadas para herencia.
CA1003: Utilizar instancias genéricas de controlador de eventos Un tipo contiene un delegado que devuelve void cuya firma contiene dos parámetros (el primero un objeto y el segundo un tipo asignable a EventArgs), y el ensamblado que lo contiene está dirigido a Microsoft .NET Framework 2.0.
CA1005: Evitar los parámetros excesivos en tipos genéricos Cuantos más parámetros type contenga un tipo genérico, más difícil resulta saber y recordar qué representa cada uno de ellos. Suele resultar evidente con un parámetro de tipo, como en List<T>, y en algunos casos donde hay dos parámetros de tipo, como en Dictionary<TKey, TValue>. Sin embargo, si hay más de dos parámetros de tipo, la dificultad se vuelve demasiado grande para la mayoría de los usuarios.
CA1008: Las enumeraciones deben tener un valor igual a cero 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.
CA1010: Las colecciones deben implementar la interfaz genérica Para ampliar la utilidad de una colección, implemente una de las interfaces de colección genéricas. Entonces podrá utilizar la colección para rellenar tipos de colecciones genéricas.
CA1012: los tipos abstractos no deberían tener constructores públicos Los tipos derivados pueden llamar solo a los constructores de tipos abstractos. Puesto que los constructores públicos crean instancias de un tipo y no se pueden crear instancias de un tipo abstracto, no es correcto diseñar un tipo abstracto con un constructor público.
CA1014: Marcar los ensamblados con CLSCompliantAttribute La Common Language Specification (CLS) define las restricciones de nomenclatura, los tipos de datos y las reglas a las que los ensamblados deben ajustarse si se van a utilizar los lenguajes de programación. Los procedimientos de diseño establecen que todos los ensamblados deben indicar explícitamente la conformidad a CLS mediante el atributo CLSCompliantAttribute. Si este atributo no está presente en un ensamblado, el ensamblado no es conforme.
CA1016: Marcar los ensamblados con AssemblyVersionAttribute .NET utiliza el número de versión para identificar de forma única un ensamblado y para enlazarse a los tipos de ensamblados con nombre seguro. El número de versión se utiliza junto con la versión y la directiva del fabricante. De forma predeterminada, las aplicaciones sólo se ejecutan con la versión de ensamblado con la que se compilaron.
CA1017: Marcar los ensamblados con ComVisibleAttribute ComVisibleAttribute determina cómo obtienen acceso los clientes COM al código administrado. Los procedimientos de diseño recomendados dictan que los ensamblados indican explícitamente la visibilidad COM. La visibilidad COM se puede establecer para un ensamblado completo y, a continuación, se puede invalidar para los tipos individuales y los miembros de tipo. Si este atributo no está presente, el contenido del ensamblado es visible para los clientes COM.
CA1018: Marcar atributos con AttributeUsageAttribute Cuando defina un atributo personalizado, márquelo utilizando AttributeUsageAttribute para indicar dónde se puede aplicar en el código fuente. El significado de un atributo y el uso que se le va a dar determinará sus ubicaciones válidas en código.
CA1019: Definir descriptores de acceso para los argumentos de atributo Los atributos pueden definir argumentos obligatorios que deben especificarse al aplicar el atributo a un destino. Éstos también se denominan argumentos posicionales porque se proporcionan para atribuir constructores como parámetros posicionales. Para cada argumento obligatorio, el atributo debe proporcionar también una propiedad de sólo lectura correspondiente de modo que el valor del argumento se pueda recuperar en tiempo de ejecución. Los atributos también pueden definir argumentos opcionales, que también se denominan argumentos con nombre. Estos argumentos se proporcionan para atribuir constructores por nombre y deben tener una propiedad de lectura/escritura correspondiente.
CA1021: Evitar los parámetros out Para pasar tipos por referencia (utilizando los parámetros out o ref) es necesario tener experiencia con punteros, saber la diferencia entre los tipos de referencia y los tipos de valor, y controlar métodos con varios valores devueltos. Además, no se suele saber qué diferencia hay entre los parámetros out y ref.
CA1024: Utilizar las propiedades donde corresponda Un método público o protegido tiene un nombre que comienza por "Get", no toma ningún parámetro y devuelve un valor que no es una matriz. El método podría ser un buen candidato para convertirse en propiedad.
CA1027: Marcar enumeraciones con FlagsAttribute Una enumeración es un tipo de valor que define un conjunto de constantes con nombre relacionadas. Aplique FlagsAttribute a una enumeración cuando se pueda combinar con sentido sus constantes con nombre.
CA1028: El almacenamiento de la enumeración debe ser de tipo Int32 Una enumeración es un tipo de valor que define un conjunto de constantes con nombre relacionadas. De manera predeterminada, el tipo de datos System.Int32 se utiliza para almacenar el valor constante. Aunque puede cambiar este tipo subyacente, no es necesario ni se recomienda en la mayoría de los escenarios.
CA1030: Utilizar eventos cuando sea apropiado Esta regla detecta métodos que tienen nombres que normalmente se utilizarían para eventos. Si se llama a un método en respuesta a un cambio de estado claramente definido, un controlador de eventos debe invocar al método. Los objetos que llaman al método deben provocar eventos en lugar de llamar directamente al método.
CA1031: No capturar los tipos de excepción general No se deben capturar excepciones generales. Detecte una excepción más específica o vuelva a producir una excepción general como la última instrucción del bloque Catch.
CA1032: Implementar constructores de excepción estándar El error al proporcionar el conjunto completo de constructores puede dificultar el control correcto de las excepciones.
CA1033: Los tipos secundarios deben poder llamar a los métodos de interfaz Un tipo no sellado visible externamente proporciona un método explícito de implementación de una interfaz pública pero no proporciona un método visible externamente alternativo con el mismo nombre.
CA1034: Los tipos anidados no deben ser visibles Los tipos anidados son tipos declarados en el ámbito de otro tipo. Los tipos anidados son útiles para encapsular los detalles de la implementación privada del tipo contenido. Los tipos anidados, utilizados para este propósito, no deben ser visibles externamente.
CA1036: Invalidar métodos en tipos comparables Un tipo público o protegido implementa la interfaz System.IComparable. No invalida Object.Equals ni sobrecarga al operador específico del lenguaje para la igualdad, desigualdad, menor que o mayor que.
CA1040: Evitar las interfaces vacías Las interfaces definen miembros que proporcionan un comportamiento o acuerdo de uso. Cualquier tipo puede adoptar la funcionalidad descrita por la interfaz sin tener en cuenta dónde aparece el tipo en la jerarquía de herencia. Un tipo implementa una interfaz proporcionando las implementaciones para los miembros de la interfaz. Una interfaz vacía no define ningún miembro; por consiguiente, no define ningún contrato que se pueda implementar.
CA1041: Proporcionar un mensaje ObsoleteAttribute Un tipo o miembro se marca con un atributo System.ObsoleteAttribute para el que no se ha especificado su propiedad ObsoleteAttribute.Message. Cuando se compila un tipo o miembro marcado con ObsoleteAttribute, se muestra la propiedad Message del atributo. Esto proporciona información al usuario sobre el miembro o tipo obsoleto.
CA1043: Utilizar un argumento integral o de cadena en indizadores Los indizadores (es decir, las propiedades indizadas) deben utilizar tipos enteros o de cadena para el índice. Estos tipos se utilizan normalmente para indizar las estructuras de datos y aumentan la utilidad de la biblioteca. El uso del tipo Object debería limitarse a los casos en los que el tipo entero o de cadena no se puede especificar en tiempo de diseño.
CA1044: Las propiedades no deben ser de solo escritura Aunque es aceptable y a menudo necesario tener una propiedad de solo lectura, las directrices de diseño prohíben el uso de propiedades de solo escritura. Esto es porque si se deja que un usuario configure un valor, y a continuación se impide que el usuario vea ese valor, no proporciona ninguna seguridad. Además, sin acceso de lectura, no se puede ver el estado de los objetos compartidos, lo que limita su utilidad.
CA1045: No pasar tipos por referencia Para pasar tipos por referencia (utilizando los parámetros out o ref) es necesario tener experiencia con punteros, saber la diferencia entre los tipos de referencia y los tipos de valor, y controlar métodos con varios valores devueltos. Los arquitectos de bibliotecas cuyos diseños están destinados a los usuarios en general no deben esperar que los usuarios dominen el uso de los parámetros out o ref.
CA1046: No sobrecargar el operador de igualdad en los tipos de referencia Para los tipos de referencia, la implementación predeterminada del operador de igualdad casi siempre es correcta. De manera predeterminada, dos referencias son iguales sólo si señalan al mismo objeto.
CA1047: No declarar miembros protegidos en tipos sellados Los tipos declaran miembros protegidos para que los tipos heredados puedan obtener acceso o reemplazar el miembro. Por definición, no se puede heredar de tipos sealed, lo que significa que no se puede llamar a los métodos protegidos en tipos sealed.
CA1050: Declarar tipos en espacios de nombres Los tipos se declaran dentro de los espacios de nombres para evitar conflictos de nombre y como una forma de organizar los tipos relacionados en una jerarquía de objetos.
CA1051: No declarar campos de instancia visibles El uso principal de un campo debe ser como un detalle de implementación. Los campos deben ser privados o internos y deben exponerse utilizando propiedades.
CA1052: Los tipos titulares estáticos deben estar sellados Un tipo público o protegido solamente contiene miembros estáticos y no se declara con el modificador sealed (NotInheritable) (Referencia de C#). Un tipo que no está diseñado para heredarse debería marcarse con el modificador sealed para impedir su uso como tipo base.
CA1053: Los tipos titulares estáticos no deben tener constructores Un tipo público o público anidado declara sólo miembros estáticos y tiene un constructor predeterminado público o protegido. El constructor no es necesario puesto que al llamar a los miembros estáticos no se requiere una instancia del tipo. La sobrecarga de la cadena debería llamar a la sobrecarga del identificador URI utilizando el argumento string por motivos de seguridad y protección.
CA1054: Los parámetros de URI no deben ser cadenas Si un método toma una representación de cadena de un identificador URI, debe proporcionarse la sobrecarga correspondiente que toma una instancia de la clase URI, que proporciona estos servicios de forma segura.
CA1055: Los valores devueltos URI no deben ser cadenas Esta regla supone que el método devuelve un URI. Las representaciones de cadena de identificadores URI tienen tendencia a analizar y codificar errores, por lo que pueden crear puntos vulnerables en la seguridad. La clase System.Uri proporciona estos servicios de una manera segura.
CA1056: Las propiedades URI no deben ser cadenas La regla supone que la propiedad representa un Identificador uniforme de recursos (URI). Las representaciones de cadena de identificadores URI tienen tendencia a analizar y codificar errores, por lo que pueden crear puntos vulnerables en la seguridad. La clase System.Uri proporciona estos servicios de una manera segura.
CA1058: Los tipos no deben ampliar ciertos tipos base Un tipo visible externamente extiende algunos tipos base. Utilice una de las alternativas.
CA1060: Mueva P/Invokes a la clase NativeMethods Los métodos de invocación de plataforma, como los marcados con el atributo System.Runtime.InteropServices.DllImportAttribute, o los métodos definidos con la palabra clave Declare en Visual Basic, tienen acceso al código no administrado. Estos métodos deben ser de la clase NativeMethods, UnsafeNativeMethods o SafeNativeMethods.
CA1061: No ocultar métodos de clase base Un método de un tipo base está oculto por un método del mismo nombre en un tipo derivado cuando la firma del parámetro del método derivado solo se diferencia por tipos derivados de manera más débil que los tipos correspondientes de la firma del parámetro del método base.
CA1062: Validar argumentos de métodos públicos Todos los argumentos de referencia pasados a métodos visibles externamente se deben comprobar para ver si son null.
CA1063: Implementar IDisposable correctamente Todos los tipos IDisposable deben implementar el modelo de Dispose correctamente.
CA1064: Las excepciones deben ser públicas Una excepción interna solo se ve dentro de su propio ámbito interno. Cuando la excepción esté fuera del ámbito interno, sólo se podrá usar la excepción base para detectarla. Si la excepción interna se hereda de Exception, SystemException o ApplicationException, el código externo no tendrá información suficiente para saber qué hacer con la excepción.
CA1065: No producir excepciones en ubicaciones inesperadas Un método que no se espera que produzca excepciones inicia una excepción.
CA1066: Implementar IEquatable al invalidar Equals Un tipo de valor invalida el método Equals, pero no implementa IEquatable<T>.
CA1067: Invalidar Equals al implementar IEquatable Un tipo implementa IEquatable<T>, pero no invalida el método Equals.
CA1068: Los parámetros CancellationToken deben aparecer en último lugar Un método tiene un parámetro CancellationToken que no es el último parámetro.
CA1069: Los enumeradores no deben tener valores duplicados Una enumeración tiene varios miembros a los que se les asigna explícitamente el mismo valor constante.
CA1070: No declarar los campos de eventos como virtuales Un evento similar a un campo se declaró como virtual.
CA1200: Evitar el uso de etiquetas cref con un prefijo El atributo cref en una etiqueta de documentación XML significa "referencia de código". Especifica que el texto interno de la etiqueta es un elemento de código, como un tipo, un método o una propiedad. Evite el uso de etiquetas cref con prefijos, ya que impide que el compilador compruebe las referencias. También impide que el entorno de desarrollo integrado (IDE) de Visual Studio busque y actualice estas referencias de símbolos durante las refactorizaciones.
CA1303: No pasar literales como parámetros localizados Un método visible externamente pasa un literal de cadena como parámetro para un constructor o método de .NET, y esa cadena debería ser localizable.
CA1304: Especificar CultureInfo Un método o constructor llama a un miembro que tiene una sobrecarga que acepta un parámetro System.Globalization.CultureInfo, y el método o constructor no llama a la sobrecarga que toma el parámetro CultureInfo. Si no se proporciona un objeto CultureInfo o System.IFormatProvider, el valor predeterminado proporcionado por el miembro sobrecargado podría no surtir el efecto deseado en todas las configuraciones regionales.
CA1305: Especificar IFormatProvider Un método o constructor llama a uno o más miembros que tienen sobrecargas que aceptan un parámetro System.IFormatProvider, y el método o constructor no llama a la sobrecarga que toma el parámetro IFormatProvider. Si no se proporciona un objeto System.Globalization.CultureInfo o IFormatProvider, el valor predeterminado proporcionado por el miembro sobrecargado podría no surtir el efecto deseado en todas las configuraciones regionales.
CA1307: Especificar StringComparison para mayor claridad Una operación de comparación de cadenas utiliza una sobrecarga de método que no establece un parámetro StringComparison.
CA1308: Normalizar cadenas en mayúsculas 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 pasan a minúsculas.
CA1309: Utilizar StringComparison ordinal Una operación no lingüística de comparación de cadenas no establece el parámetro StringComparison en Ordinal ni en OrdinalIgnoreCase. Si se establece explícitamente el parámetro en StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase, el código será más rápido y ganará en precisión y confiabilidad.
CA1310: Especificar StringComparison para mayor corrección Una operación de comparación de cadenas usa una sobrecarga de método que no establece un parámetro StringComparison y utiliza de forma predeterminada la comparación de cadenas específica de la referencia cultural.
CA1311: Especificar una referencia cultural o usar una versión invariable Especifique una referencia cultural o use una referencia cultural invariable para evitar la dependencia implícita de la referencia cultural actual al llamar a ToUpper o ToLower.
CA1401: Los elementos P/Invoke no deben estar visibles Un método público o protegido en un tipo público tiene el atributo System.Runtime.InteropServices.DllImportAttribute (también se implementa por la palabra clave Declare en Visual Basic). No se deberían exponer estos métodos.
CA1416: Validación de la compatibilidad con las plataformas El uso de API dependientes de la plataforma en un componente hace que el código deje de funcionar en todas las plataformas.
CA1417: No usar OutAttribute en parámetros de cadena para P/Invoke Los parámetros de cadena pasados por valor con OutAttribute pueden desestabilizar el entorno de ejecución si la cadena es una cadena internalizada.
CA1418: uso de una cadena de plataforma válida El analizador de compatibilidad de plataformas requiere un nombre y una versión de plataforma válidos.
CA1419: Proporcionar un constructor sin parámetros que sea tan visible como el tipo contenedor para los tipos concretos derivados de "System.Runtime.InteropServices.SafeHandle" Proporcionar un constructor sin parámetros tan visible como el tipo contenedor para un tipo derivado de System.Runtime.InteropServices.SafeHandle permite un mejor rendimiento y uso con soluciones de interoperabilidad generadas por el origen.
CA1420: La propiedad, el tipo o el atributo requiere serialización en tiempo de ejecución El uso de características que requieren serialización en tiempo de ejecución cuando esta está deshabilitada produce excepciones en tiempo de ejecución.
CA1421: El método usa la serialización en tiempo de ejecución cuando se aplica DisableRuntimeMarshallingAttribute. Un método usa la serialización en tiempo de ejecución, y la serialización en tiempo de ejecución está deshabilitada explícitamente.
CA1422: Validación de la compatibilidad con la plataforma No se recomienda llamar a una API obsoleta en un sistema operativo determinado (versión) desde un sitio de llamada al que se puede acceder desde ese sistema operativo (versión).
CA1501: Evitar una herencia excesiva Un tipo tiene más de cuatro niveles de profundidad en su jerarquía de herencia. Las jerarquías de tipos con demasiados niveles de anidación pueden resultar difíciles de seguir, comprender y mantener.
CA1502: Evitar una complejidad excesiva Esta regla mide el número de rutas de acceso independientes de forma lineal a través del método, que es determinado por el número y la complejidad de bifurcaciones condicionales.
CA1505: Evitar código que no se puede mantener Un tipo o método tiene un valor del índice de mantenimiento bajo. Un índice de mantenimiento bajo indica que un tipo o método resulta probablemente difícil de mantener y se debería volver a diseñar.
CA1506: Evitar el acoplamiento excesivo de clases Esta regla mide el acoplamiento de clase contando el número de referencias de tipo únicas que contiene un tipo o método.
CA1507: Usar nameof en lugar de la cadena Se usa un literal de cadena como argumento donde se podría utilizar una expresión nameof.
CA1508: Evitar código de condición no alcanzado Un método tiene código condicional que siempre se evalúa como true o false en tiempo de ejecución. Esto genera código no alcanzado en la rama false de la condición.
CA1509: Entrada no válida en el archivo de configuración de métricas de código Las reglas de métricas del código, como CA1501, CA1502, CA1505 y CA1506, proporcionan un archivo de configuración denominado CodeMetricsConfig.txt que tiene una entrada no válida.
CA1510:Uso del asistente de inicio ArgumentNullException Los asistentes de inicio son más sencillos y eficaces que bloques if que construyen una nueva instancia de excepción.
CA1511: Uso del asistente de inicio ArgumentException Los asistentes de inicio son más sencillos y eficaces que bloques if que construyen una nueva instancia de excepción.
CA1512: Uso del asistente de inicio ArgumentOutOfRangeException Los asistentes de inicio son más sencillos y eficaces que bloques if que construyen una nueva instancia de excepción.
CA1513: Uso del asistente de inicio ObjectDisposedException Los asistentes de inicio son más sencillos y eficaces que bloques if que construyen una nueva instancia de excepción.
CA1514: evitar el argumento de longitud redundante Se usa un argumento de longitud redundante al final de una cadena o búfer. Una longitud calculada puede ser propensa a errores y también es innecesaria.
CA1515: Considere la posibilidad de hacer que los tipos públicos sean internos A diferencia de una biblioteca de clases, la API de una aplicación no suele hacer referencia públicamente, por lo que los tipos se pueden marcar internamente.
CA1700: No nombrar valores de enumeración como 'Reserved' Esta regla supone que un miembro de la enumeración con un nombre que contiene la palabra "reserved" no se utiliza actualmente pero hace de marcador de posición para que se pueda quitar o cambiar el nombre en una versión posterior. Quitar o cambiar el nombre de un miembro es un cambio importante.
CA1707: Los identificadores no deben contener caracteres de subrayado Por convención, los nombres del identificador no contienen el carácter de subrayado (_). Esta regla comprueba espacios de nombres, tipos, miembros y parámetros.
CA1708: Los identificadores se deben diferenciar en algo más que en el uso de mayúsculas y minúsculas Los identificadores de los espacios de nombres, miembros y parámetros no puede distinguirse sólo por mayúsculas o minúsculas porque los lenguajes que tienen como destino el Common Language Runtime no necesitan distinguir entre mayúsculas y minúsculas.
CA1710: Los identificadores deben tener un sufijo correcto Por convención, los nombres de tipos que extienden determinados tipos base o que implementan algunas interfaces, o tipos derivados de estos tipos, tienen un sufijo asociado al tipo base o a la interfaz.
CA1711: Los identificadores no deben tener un sufijo incorrecto Por convención, los nombres de tipos que extienden determinados tipos base o que implementan algunas interfaces, o tipos derivados de estos tipos, deben terminar con unos sufijos reservados específicos. Otros nombres de tipo no deben utilizar estos sufijos reservados.
CA1712: No utilizar prefijos en valores de enumeración con el nombre del tipo Los nombres de los miembros de la enumeración no llevan el nombre de tipo como prefijo porque se espera que las herramientas de desarrollo proporcionen la información de tipo.
CA1713: Los eventos no deben tener prefijos antes ni después El nombre de un evento empieza por "Before" o "After". Para nombrar los eventos relacionados que se provocan en una secuencia específica, utilice el tiempo presente o pasado para indicar la posición relativa en la secuencia de acciones.
CA1714: Las enumeraciones Flags deben tener nombres en plural Una enumeración pública tiene el atributo System.FlagsAttribute y su nombre no termina en "s". Los tipos marcados con FlagsAttribute tienen nombres en plural porque el atributo indica que se puede especificar más de un valor.
CA1715: Los identificadores deben tener el prefijo correcto El nombre de una interfaz visible externamente no empieza por "I" mayúscula. El nombre de un parámetro de tipo genérico en un tipo o método visibles externamente no empieza por "T" mayúscula.
CA1716: Los identificadores no deben coincidir con palabras clave Un nombre de espacio de nombres o un nombre de tipo coinciden con una palabra clave reservada en un lenguaje de programación. Los identificadores para los espacios de nombres y tipos no deberían coincidir con palabras clave definidas por los lenguajes que tienen como destino el Common Language Runtime.
CA1717: Solo las enumeraciones FlagsAttribute deben tener nombres en plural Las convenciones de nomenclatura establecen que un nombre en plural para una enumeración indica que se pueden especificar varios valores de enumeración al mismo tiempo.
CA1720: Los identificadores no deben contener nombres de tipo El nombre de un parámetro en un miembro visible externamente contiene un nombre de tipo de datos o el nombre de un miembro visible externamente contiene un nombre de tipo de datos específico del lenguaje.
CA1721: Los nombres de propiedades no deben coincidir con los métodos get El nombre de un miembro público o protegido empieza por "Get" y en cualquier otro caso coincide con el nombre de una propiedad pública o protegida. Las propiedades y métodos "Get" deberían tener nombres que distingan claramente su función.
CA1724: Los nombres de tipo no deben coincidir con los espacios de nombres Los nombres de tipo no deben coincidir con los nombre de los espacios de nombres de .NET. Infringir esta regla puede reducir la utilidad de la biblioteca.
CA1725: Los nombres de parámetro deben coincidir con la declaración base El uso del mismo nombre para un parámetro en una jerarquía de reemplazo aumenta la utilidad de los reemplazos de método. Cuando el nombre de un parámetro en un método derivado es distinto del nombre de la declaración base, puede resultar difícil determinar si el método es un reemplazo del método base o una nueva sobrecarga del método.
CA1727: Uso de PascalCase para marcadores de posición con nombre Use PascalCase para marcadores de posición con nombre en la plantilla de mensaje de registro.
CA1801: Revisar parámetros sin utilizar Una firma de método incluye un parámetro que no se utiliza en el cuerpo del método.
CA1802: Utilizar literales cuando sea apropiado Un campo se declara como estático y de solo lectura (Shared y ReadOnly en Visual Basic), y se inicializa con un valor que se puede calcular en tiempo de compilación. Como el valor asignado al campo de destino se calcula en tiempo de compilación, cambie la declaración a un campo const (Const en Visual Basic) para que el valor se calcule en tiempo de compilación en lugar de en tiempo de ejecución.
CA1805: No inicializar innecesariamente El entorno de ejecución de .NET inicializa todos los campos de tipos de referencia a sus valores predeterminados antes de ejecutar el constructor. En la mayoría de los casos, la inicialización explícita de un campo en su valor predeterminado es redundante, lo que aumenta los costos de mantenimiento y puede degradar el rendimiento (por ejemplo, con un mayor tamaño de ensamblado).
CA1806: No omitir resultados del método 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.
CA1810: Inicializar campos estáticos de tipo de referencia insertados Cuando un tipo declara un constructor estático explícito, el compilador Just-In-Time (JIT) agrega una comprobación a cada constructor de instancia y a cada método estático del tipo para asegurarse de que se ha llamado anteriormente al constructor estático. Las comprobaciones del constructor estático pueden reducir el rendimiento.
CA1812: Evitar las clases internas sin instancia El código del ensamblado no crea una instancia del tipo del nivel de ensamblado.
CA1813: Evitar los atributos no sellados .NET proporciona métodos para recuperar atributos personalizados. De forma predeterminada, estos métodos buscan la jerarquía de herencia de atributo. La acción de sellar el atributo elimina la búsqueda en la jerarquía de herencia y puede mejorarse el rendimiento.
CA1814: Preferir matrices escalonadas antes que multidimensionales Una matriz escalonada es una matriz cuyos elementos son matrices. Las matrices que constituyen los elementos pueden ser de tamaños diferentes, reduciendo el espacio desaprovechado para algunos conjuntos de datos.
CA1815: Invalidar Equals y el operador Equals en los tipos de valores Para los tipos de valor, la implementación heredada de Equals utiliza la biblioteca de reflexión y compara el contenido de todos los campos. Mediante el cálculo, la reflexión es cara y no es necesario comparar cada campo para comprobar si hay igualdad. Si espera que los usuarios comparen u ordenen instancias, o utilicen instancias como claves de tabla hash, el tipo de valor debe implementar Equals.
CA1816: Llamar a GC.SuppressFinalize correctamente 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).
CA1819: Las propiedades no deben devolver matrices Las matrices devueltas por las propiedades no están protegidas contra escritura, aun cuando la propiedad es de solo 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.
CA1821: Quitar finalizadores vacíos Siempre que pueda, evite los finalizadores debido a la sobrecarga de rendimiento adicional necesaria para el seguimiento de la duración del objeto. Un finalizador vacío produce una sobrecarga adicional sin ningún beneficio.
CA1822: Marcar miembros como estáticos Los miembros que no acceden a datos de instancia o que llaman a métodos de instancia se pueden marcar como estáticos (Shared en Visual Basic). Después de marcar los métodos como static, el compilador emite los sitios de llamada no virtuales para estos miembros. Esto puede proporcionar una mejora apreciable del rendimiento del código en el que el rendimiento es fundamental.
CA1823: Evitar los campos privados sin utilizar Se detectaron campos privados a los que no parece que se tenga acceso en el ensamblado.
CA1824: Marcar los ensamblados con NeutralResourcesLanguageAttribute El atributo NeutralResourcesLanguage informa al administrador de recursos del idioma utilizado para mostrar los recursos de una referencia cultural neutra de un ensamblado. Esto mejora el rendimiento de la búsqueda del primer recurso que se carga y puede reducir el espacio de trabajo.
CA1825: Evitar asignaciones de matrices de longitud cero Al inicializar una matriz de longitud cero, se produce una asignación de memoria innecesaria. En su lugar, use la instancia de matriz vacía asignada estáticamente mediante una llamada a Array.Empty. La asignación de memoria se comparte entre todas las invocaciones de este método.
CA1826: Usar la propiedad en lugar del método Linq Enumerable El método Enumerable de LINQ se ha usado en un tipo que admite una propiedad equivalente y más eficaz.
CA1827: No usar Count/LongCount si se puede usar Any Se ha usado el método Count o LongCount, cuando el método Any sería más eficaz.
CA1828: No usar CountAsync/LongCountAsync si se puede usar AnyAsync Se ha usado el método CountAsync o LongCountAsync, cuando el método AnyAsync sería más eficaz.
CA1829: Usar la propiedad Length/Count en lugar del método Enumerable.Count El método Count de LINQ se ha usado en un tipo que admite una propiedad Length o Count equivalente y más eficaz.
CA1830: Preferir las sobrecargas de método Append e Insert fuertemente tipadas en StringBuilder Append y Insert proporcionan sobrecargas para varios tipos más allá de String. Siempre que sea posible, use sobrecargas fuertemente tipadas antes que ToString() y la sobrecarga basada en cadena.
CA1831: Usar AsSpan en lugar de indizadores basados en intervalos para una cadena cuando proceda Cuando se usa un indizador de intervalo en una cadena y se asigna implícitamente el valor a un tipo ReadOnlySpan<char>, se usará el método Substring en lugar de Slice, que genera una copia de la parte solicitada de la cadena.
CA1832: Usar AsSpan o AsMemory en lugar de indizadores basados en intervalos para obtener la parte ReadOnlySpan o ReadOnlyMemory de una matriz Cuando se usa un indizador de intervalo en una matriz y se asigna implícitamente el valor a un tipo ReadOnlySpan<T> o ReadOnlyMemory<T>, se utilizará el método GetSubArray en lugar de Slice, lo que genera una copia de la parte solicitada de la matriz.
CA1833: Usar AsSpan o AsMemory en lugar de indizadores basados en intervalos para obtener la parte Span o Memory de una matriz Cuando se usa un indizador de intervalo en una matriz y se asigna implícitamente el valor a un tipo Span<T> o Memory<T>, se utilizará el método GetSubArray en lugar de Slice, lo que genera una copia de la parte solicitada de la matriz.
CA1834: Usar StringBuilder.Append(char) para cadenas de un solo carácter StringBuilder tiene una sobrecarga de Append que toma char como argumento. Es preferible llamar a la sobrecarga de char por motivos de rendimiento.
CA1835: Preferencia de sobrecargas basadas en "Memory" para "ReadAsync" y "WriteAsync" "Stream" tiene una sobrecarga de "ReadAsync" que toma un valor "Memory<Byte>" como primer argumento y una sobrecarga de "WriteAsync " que toma un valor "ReadOnlyMemory<Byte>" como primer argumento. Es preferible llamar a las sobrecargas basadas en memoria, que son más eficaces.
CA1836: Preferencia de IsEmpty con respecto a Count cuando esté disponible Se prefiere la propiedad IsEmpty que es más eficaz que Count, Length, Count<TSource>(IEnumerable<TSource>) o LongCount<TSource>(IEnumerable<TSource>) para determinar si el objeto contiene o no elementos.
CA1837: Uso de Environment.ProcessId en lugar de Process.GetCurrentProcess().Id Environment.ProcessId es más sencillo y rápido que Process.GetCurrentProcess().Id.
CA1838: Evitar los parámetros StringBuilder para los elementos P/Invoke Al serializar 'StringBuilder', siempre se crea una copia del búfer nativo, lo que da lugar a varias asignaciones para una operación de serialización.
CA1839: Usar Environment.ProcessPath en lugar de Process.GetCurrentProcess().MainModule.FileName Environment.ProcessPath es más sencillo y rápido que Process.GetCurrentProcess().MainModule.FileName.
CA1840: Use Environment.CurrentManagedThreadId en lugar de Thread.CurrentThread.ManagedThreadId Environment.CurrentManagedThreadId es más compacto y eficaz que Thread.CurrentThread.ManagedThreadId.
CA1841: preferencia por los métodos Contains para un diccionario A menudo, llamar a Contains en la colección Keys o Values puede resultar más costoso que llamar a ContainsKey o ContainsValue en el propio diccionario.
CA1842: No usar 'WhenAll' con una sola tarea El uso de WhenAll con una sola tarea puede provocar una pérdida de rendimiento. Espere o devuelva la tarea en su lugar.
CA1843: No usar "WaitAll" con una sola tarea El uso de WaitAll con una sola tarea puede provocar una pérdida de rendimiento. Espere o devuelva la tarea en su lugar.
CA1844: Proporcionar invalidaciones basadas en memoria de métodos asincrónicos al usar subclases "Stream" Para mejorar el rendimiento, invalide los métodos asincrónicos basados en memoria al crear subclases "Stream". A continuación, implemente los métodos basados en matriz en términos de los métodos basados en memoria.
CA1845: uso de 'string.Concat' basado en Span Es más eficaz usar AsSpan y string.Concat, en lugar de Substring y un operador de concatenación.
CA1846: Preferencia de AsSpan sobre Substring AsSpan es más eficaz que Substring. Substring realiza una copia de cadena O(n), mientras que AsSpan no lo hace y tiene un costo constante. AsSpan tampoco realiza ninguna asignación de montón.
CA1847: Uso del literal char para la búsqueda de un solo carácter Use string.Contains(char) en lugar de string.Contains(string) al buscar un solo carácter.
CA1848: Usar los delegados LoggerMessage Para mejorar el rendimiento, use los delegados LoggerMessage.
CA1849: Llamada a métodos asincrónicos en un método asincrónico En un método que ya es asincrónico, las llamadas a otros métodos deben ser a sus versiones asincrónicas, donde existan.
CA1850: Preferencia del método estático HashData sobre ComputeHash Es más eficaz usar el método estático HashData para crear y administrar una instancia de HashAlgorithm para llamar a ComputeHash.
CA1851: Posibles enumeraciones múltiples de la colección IEnumerable Posibles enumeraciones múltiples de la colección IEnumerable. Considere la posibilidad de usar una implementación que evite varias enumeraciones.
CA1852: Tipos internos de sello Un tipo que no es accesible fuera de su ensamblado y que no tiene subtipos dentro de su ensamblado contenedor no está sellado.
CA1853: Llamada innecesaria a 'Dictionary.ContainsKey(key)' No es necesario proteger Dictionary.Remove(key) con Dictionary.ContainsKey(key). Dictionary<TKey,TValue>.Remove(TKey) ya comprueba si la clave existe y no inicia si no existe.
CA1854: Preferir el método 'IDictionary.TryGetValue(TKey, out TValue)' Prefiera 'TryGetValue' en un acceso de indexador Dictionary protegido por una comprobación 'ContainsKey'. 'ContainsKey' y el indexador buscan la clave, por lo que el uso de 'TryGetValue' evita la búsqueda adicional.
CA1855: Usar span<T>. Clear() en lugar de Span<T>. Fill() Es más eficaz llamar aSpan<T>.Clear() que llamar a Span<T>.Fill(T) para rellenar los elementos del intervalo con un valor predeterminado.
CA1856: Uso incorrecto del atributo ConstantExpected El atributo ConstantExpectedAttribute no se aplica correctamente en un parámetro.
CA1857: El parámetro espera una constante para un rendimiento óptimo Un argumento no válido se pasa a un parámetro anotado con ConstantExpectedAttribute.
CA1858: Usar "StartsWith" en lugar de IndexOf Es más eficaz llamar a String.StartsWith que llamar a String.IndexOf para comprobar si una cadena comienza con un prefijo determinado.
CA1859: Usar tipos concretos cuando sea posible para mejorar el rendimiento El código usa tipos de interfaz o tipos abstractos, lo que genera llamadas virtuales o llamadas de interfaz innecesarias.
CA1860: evite usar el método de extensión "Enumerable.Any()" Es más eficiente y claro utilizar Length, Count o IsEmpty (si es posible) que llamar a Enumerable.Any para determinar si un tipo de colección tiene algún elemento.
CA1861: Evitar matrices constantes como argumentos Las matrices constantes pasadas como argumentos no se reutilizan, lo que implica una sobrecarga de rendimiento. Considere la posibilidad de extraerlas en campos "static readonly" para mejorar el rendimiento.
CA1862: Usar las sobrecargas del método "StringComparison" para realizar comparaciones de cadenas que no distinguen mayúsculas de minúsculas Cuando el código llama a ToLower() o ToUpper() para realizar una comparación de cadenas que no distingue mayúsculas de minúsculas, se realiza una asignación innecesaria.
CA1863: Usar 'CompositeFormat' Para reducir el costo de formato, almacene en caché y use una instancia CompositeFormat como argumento para String.Format o StringBuilder.AppendFormat.
CA1864: Se prefiere el método "IDictionary.TryAdd(TKey, TValue)" Tanto Dictionary<TKey,TValue>.ContainsKey(TKey) como Dictionary<TKey,TValue>.Add realizan una búsqueda, que es redundante. Es más eficaz llamar a Dictionary<TKey,TValue>.TryAdd, que devuelve un valor bool que indica si el valor se agregó o no. TryAdd no sobrescribe el valor de la clave si la clave ya está presente.
CA1865-CA1867: Usar la sobrecarga char La sobrecarga de char es una sobrecarga de mejor rendimiento para una cadena con un único char.
CA1868: llamada innecesaria a "Contains" para conjuntos Tanto ISet<T>.Add(T) como ICollection<T>.Remove(T) realizan una búsqueda, lo que hace que sea redundante llamar a ICollection<T>.Contains(T) de antemano. Es más eficaz llamar a Add(T) o Remove(T) directamente, lo que devuelve un valor booleano que indica si el elemento se ha agregado o quitado.
CA1869: Almacenamiento en caché y reutilización de instancias de "JsonSerializerOptions" El uso de una instancia local de JsonSerializerOptions para la serialización o deserialización puede degradar considerablemente el rendimiento de la aplicación si el código se ejecuta varias veces, ya que System.Text.Json almacena internamente en caché los metadatos relacionados con la serialización en la instancia proporcionada.
CA1870: Uso de una instancia de "SearchValues" almacenada en caché El uso de una instancia de caché SearchValues<T> es más eficaz que pasar valores a "IndexOfAny" o "IndexOfAny" directamente.
CA1871: No pasar una estructura que acepta valores NULL a 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' acepta un 'object', por lo que pasar una estructura que acepta valores NULL podría hacer que el valor se boxee.
CA1872: Preferir 'Convert.ToHexString' y 'Convert.ToHexStringLower' en vez de cadenas de llamadas basadas en 'BitConverter.ToString' Use Convert.ToHexString o Convert.ToHexStringLower al codificar bytes en una representación de cadena hexadecimal. Estos métodos son más eficaces y fáciles de asignar que usar BitConverter.ToString en combinación con String.Replace para reemplazar guiones y String.ToLower.
CA2000: Desechar objetos antes de perder el ámbito Dado que podría producirse un evento excepcional que evitaría que el finalizador de un objeto se ejecutase, el objeto debe estar disponible en su lugar antes de que todas las referencias a él estén fuera del ámbito.
CA2002: No bloquear objetos con identidad débil Se dice que un objeto tiene una identidad débil cuando se puede tener acceso directamente a través de los límites del dominio de aplicación. Un subproceso que intenta obtener un bloqueo en un objeto que tiene identidad débil se puede bloquear con un segundo subproceso en un dominio de aplicación diferente que tenga bloqueado el mismo objeto.
CA2007: No esperar una tarea directamente Un método asincrónico espera a un objeto Task directamente. Cuando un método asincrónico espera un objeto Task directamente, la continuación se produce en el mismo subproceso que ha creado la tarea. Este comportamiento puede ser costoso en términos de rendimiento y puede dar lugar a un interbloqueo en el subproceso de la interfaz de usuario. Considere la posibilidad de llamar a Task.ConfigureAwait(Boolean) para indicar su intención de continuación.
CA2008: No crear tareas sin pasar un elemento TaskScheduler Una operación de creación o continuación de tareas utiliza una sobrecarga de método que no especifica un parámetro TaskScheduler.
CA2009: No llame a ToImmutableCollection en un valor ImmutableCollection Se ha llamado innecesariamente al método ToImmutable en una colección inmutable desde el espacio de nombres System.Collections.Immutable.
CA2011: No asignar la propiedad dentro de su establecedor Se ha asignado accidentalmente un valor a una propiedad dentro de su propio descriptor de acceso set.
CA2012: Usar ValueTasks correctamente Los objetos ValueTask devueltos de las invocaciones de miembro están diseñados para que se espere por ellos de forma directa. Los intentos de consumir un objeto ValueTask varias veces o acceder directamente al resultado de uno antes de saber que se ha completado pueden iniciar una excepción o producir daños. Probablemente la omisión de ese tipo de objeto ValueTask indique que se trata de un error funcional y puede degradar el rendimiento.
CA2013: No usar ReferenceEquals con tipos de valor Al comparar valores mediante System.Object.ReferenceEquals, si objA y objB son tipos de valor, se les aplica la conversión boxing antes de que se pasen al método ReferenceEquals. Esto significa que, aunque objA y objB representen la misma instancia de un tipo de valor, el método ReferenceEquals devuelve false.
CA2014: No usar stackalloc en bucles. El espacio de pila asignado por stackalloc solo se libera al final de la invocación del método actual. Su uso en un bucle puede dar lugar a un crecimiento de pila sin enlazar y a posibles condiciones de desbordamiento de pila.
CA2015: No definir finalizadores para los tipos derivados de MemoryManager <T> La adición de un finalizador a un tipo derivado de MemoryManager<T> puede permitir que se libere memoria mientras sigue en uso en un elemento Span<T>.
CA2016: Reenviar el parámetro CancellationToken a los métodos que lo usan Reenvíe el parámetro CancellationToken a los métodos en los que se use uno para garantizar que las notificaciones de cancelación de operaciones se propagan correctamente, o bien pase CancellationToken.None de forma explícita para indicar que no se propagará el token intencionalmente.
CA2017: Error de coincidencia del recuento de parámetros El número de parámetros proporcionados en la plantilla de mensaje de registro no coincide con el número de marcadores de posición con nombre.
CA2018: el argumento count para Buffer.BlockCopy debería especificar el número de bytes que deben copiarse Al usar Buffer.BlockCopy, el argumento count especifica el número de bytes que deben copiarse. Solo debería usar Array.Length para el argumento count en matrices cuyos elementos tendrán exactamente un tamaño de un byte. Las matrices byte, sbyte y bool tienen elementos con un tamaño de un byte.
CA2019: los campos ThreadStatic no deben usar la inicialización insertada Un campo anotado con ThreadStaticAttribute se inicializa insertado o explícitamente en un constructor static (Shared en Visual Basic).
CA2020: Evitar el cambio de comportamiento causado por operadores integrados de IntPtr/UIntPtr Algunos operadores integrados agregados en .NET 7 se comportan de forma diferente a los operadores definidos por el usuario en .NET 6 y versiones anteriores. Algunos operadores que solían iniciarse en un contexto no comprobado mientras se desbordaban ya no se inician a menos que estén encapsulados en un contexto comprobado. Algunos operadores que antes no se iniciaban en un contexto comprobado ahora se inician a menos que estén encapsulados en un contexto no comprobado.
CA2021: No llamar a Enumerable.Cast<T> o Enumerable.OfType<T> con tipos incompatibles Una llamada a Enumerable.Cast<TResult>(IEnumerable) o Enumerable.OfType<TResult>(IEnumerable) especifica un parámetro de tipo incompatible con el tipo de la colección de entrada.
CA2100: Revisar consultas SQL para comprobar si tienen vulnerabilidades de seguridad Un método establece la propiedad System.Data.IDbCommand.CommandText utilizando una cadena que se construye partiendo de un argumento de cadena para el método. Esta regla supone que el argumento de cadena contiene datos proporcionados por el usuario. Una cadena de comandos de SQL compilada a partir de datos proporcionados por el usuario es vulnerable a ataques de inserción de SQL.
CA2101: Especificación de la serialización en argumentos de cadena de P/Invoke Un miembro de invocación de plataforma permite llamadores que no son de plena confianza y no serializa explícitamente la cadena. Esto puede producir una vulnerabilidad de seguridad.
CA2109: Revisar los controladores de eventos visibles Se detectó un método de control de eventos público o protegido. No se deberían exponer los métodos de control de eventos a menos que sea absolutamente necesario.
CA2119: Sellar los métodos que satisfacen las interfaces privadas Un tipo público heredable proporciona una implementación de método reemplazable de una interfaz interna (de tipo "Friend" en Visual Basic). Para corregir una infracción de esta regla, impida que el método se invalide fuera del ensamblado.
CA2153: Evitar el control de excepciones de estado dañado Las excepciones de estado dañado (CSE) indican que la memoria está dañada en el proceso. Detectar estos problemas y evitar el bloqueo del proceso puede provocar vulnerabilidades de seguridad si un atacante puede colocar una vulnerabilidad de seguridad en la región de memoria dañada.
CA2200: Reiniciar para mantener los detalles de la pila Se vuelve a producir una excepción y se especifica explícitamente en la instrucción throw. Si se vuelve a producir una excepción especificándola en la instrucción throw, se pierde la lista de llamadas al método entre el método original que produjo la excepción y el método actual.
CA2201: No provocar tipos de excepción reservados Esto hace que el error original sea difícil de detectar y depurar.
CA2207: Inicializar campos estáticos de tipo de valor insertados Un tipo de valor declara un constructor estático explícito. Para corregir una infracción de esta regla, inicialice todos los datos estáticos cuando se declara y quite el constructor estático.
CA2208: Crear instancias de las excepciones del argumento correctamente Se realiza una llamada al constructor predeterminado (sin parámetros) de un tipo de excepción que es o deriva de ArgumentException, o se pasa un argumento de cadena incorrecto a un constructor con parámetros de un tipo de excepción que es o deriva de ArgumentException.
CA2211: Los campos no constantes no deben ser visibles Los campos estáticos que no son constantes ni de sólo lectura no son seguros para subprocesos. Obtener acceso a este tipo de campo se debe controlar cuidadosamente y requiere técnicas de programación avanzadas para sincronizar el acceso al objeto de clase.
CA2213: Los campos descartables deben ser descartables Un tipo que implementa System.IDisposable declara campos que son de tipos que también implementan IDisposable. El método Dispose del tipo declarativo no llama al método Dispose del campo.
CA2214: No llamar a métodos reemplazables en constructores Cuando un constructor llama a un método virtual, es posible que no se haya ejecutado el constructor para la instancia que invoca el método.
CA2215: Los métodos Dispose deben llamar al método Dispose de la 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.
CA2216: Los tipos descartables deben declarar el finalizador Un tipo que implementa System.IDisposable y tiene campos que sugieren el uso de recursos no administrados, no implementa un finalizador descrito por Object.Finalize.
CA2217: No marcar enumeraciones con FlagsAttribute Una enumeración visible externamente está marcada con FlagsAttribute y tiene uno o varios valores que no son potencias de dos o una combinación de los otros valores definidos en la enumeración.
CA2218: Invalidar el método GetHashCode al invalidar el método Equals Un tipo público invalida System.Object.Equals pero no System.Object.GetHashCode.
CA2219: No producir excepciones en cláusulas de excepción Cuando se genera una excepción en una cláusula finally o fault, la nueva excepción oculta la excepción activa. Cuando se genera una excepción en una cláusula filter, el runtime la detecta automáticamente. Esto hace que el error original sea difícil de detectar y depurar.
CA2224: Invalidar Equals al sobrecargar operadores de igualdad Un tipo público implementa el operador de igualdad, pero no invalida System.Object.Equals.
CA2225: Las sobrecargas del operador tienen alternativas con nombre Se detectó una sobrecarga del operador y no se encontró el método alternativo con el nombre esperado. El miembro alternativo con nombre proporciona acceso a la misma funcionalidad que el operador; esto se hace para los desarrolladores que programan en lenguajes que no admiten operadores sobrecargados.
CA2226: Los operadores deben tener sobrecargas simétricas 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.
CA2229: Implementar constructores de serialización Para corregir una infracción de esta regla, implemente el constructor de serialización. Para una clase sellada, marque el constructor como privado; de lo contrario, márquelo como protegido.
CA2231: Sobrecargar el operador equals al invalidar ValueType.Equals Un tipo de valor invalida Object.Equals pero no implementa el operador de igualdad.
CA2234: Pasar objetos System.Uri en lugar de cadenas Se realiza una llamada a un método que tiene un parámetro de cadena cuyo nombre contiene "uri", "URI", "urn", "URN", "url" o "URL". El tipo declarativo del método contiene una sobrecarga de método correspondiente que tiene un parámetro System.Uri.
CA2235: Marcar todos los campos no serializables Un campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable.
CA2237: Marcar los tipos ISerializable con SerializableAttribute Para que los tipos sean reconocidos como serializables por Common Language Runtime, deben estar marcados con el atributo SerializableAttribute incluso si el tipo utiliza una rutina de serialización personalizada a través de la implementación de la interfaz ISerializable.
CA2241: Proporcionar argumentos correctos a los métodos de formato El argumento format pasado a System.String.Format no contiene un elemento de formato que corresponda a cada argumento de objeto o viceversa.
CA2242: Comprobar NaN correctamente Esta expresión prueba un valor respecto a Single.Nan o Double.Nan. Utilice IsNan(Single) o Double.IsNan(Double) para probar el valor.
CA2243: Los literales de cadena de atributo se deben analizar correctamente El parámetro de literal de cadena de un atributo no se analiza correctamente para una dirección URL, un GUID o una versión.
CA2244: No duplicar inicializaciones de elementos indexados Un inicializador de objeto tiene más de un inicializador de elemento indexado con el mismo índice de constante. Todo los inicializadores menos el último son redundantes.
CA2245: No asignar una propiedad a sí misma Una propiedad se ha asignado accidentalmente a sí misma.
CA2246: No asignar un símbolo y su miembro en la misma instrucción No se recomienda asignar un símbolo y su miembro, es decir, un campo o una propiedad, en la misma instrucción. No está claro si el acceso a miembros debía usar el valor anterior del símbolo antes de la asignación o el nuevo valor de la asignación en esta instrucción.
CA2247: El argumento pasado al constructor de TaskCompletionSource debe ser una enumeración TaskCreationOptions en lugar de TaskContinuationOptions. TaskCompletionSource tiene constructores que toman valores TaskCreationOptions que controlan la tarea subyacente y constructores que toman el estado del objeto almacenado en la tarea. Pasar accidentalmente un valor TaskContinuationOptions en lugar de TaskCreationOptions dará lugar a que la llamada trate las opciones como estado.
CA2248: Proporcionar el argumento enum correcto para Enum.HasFlag El tipo de enumeración que se pasa como argumento a la llamada de método HasFlag es diferente del tipo de enumeración que realiza la llamada.
CA2249: Valorar la posibilidad de usar String.Contains en lugar de String.IndexOf Las llamadas a string.IndexOf en las que se usa el resultado para comprobar la presencia o ausencia de una subcadena se pueden reemplazar por string.Contains.
CA2250: Usar ThrowIfCancellationRequested ThrowIfCancellationRequested comprueba automáticamente si el token se ha cancelado y, en su caso, produce una excepción OperationCanceledException.
CA2251: Usar String.Equals en String.Compare Es más claro y probable que sea más rápido usarlo String.Equals en lugar de comparar el resultado de String.Compare con cero.
CA2252: Participación en las características en versión preliminar Participe en las características en versión preliminar antes de usar las API de versión preliminar.
CA2253: Los marcadores de posición con nombre no deben ser valores numéricos Los marcadores de posición con nombre de la plantilla de mensaje de registro no deben estar compuestos solo por caracteres numéricos.
CA2254: La plantilla debe ser una expresión estática La plantilla de mensaje de registro no debe variar entre llamadas.
CA2255: El atributo ModuleInitializer no debe usarse en bibliotecas Los inicializadores de módulos están diseñados para que los utilice el código de aplicación para asegurarse de que los componentes de una aplicación se inicializan antes de que el código de aplicación empiece a ejecutarse.
CA2256: Todos los miembros declarados en interfaces primarias deben tener una implementación en una interfaz con atributos DynamicInterfaceCastableImplementation Los tipos con el atributo DynamicInterfaceCastableImplementationAttribute actúan como una implementación de interfaz para un tipo que implementa el tipo IDynamicInterfaceCastable. Como resultado, debe proporcionar una implementación de todos los miembros definidos en las interfaces heredadas, ya que el tipo que implementa IDynamicInterfaceCastable no los proporcionará de otro modo.
CA2257: Los miembros definidos en una interfaz con 'DynamicInterfaceCastableImplementationAttribute' deben ser 'static' Dado que un tipo que implementa IDynamicInterfaceCastable podría no implementar una interfaz dinámica en los metadatos, es probable que se produzcan errores en tiempo de ejecución en las llamadas a un miembro de la interfaz de instancia que no sea una implementación explícita definida en este tipo. Para evitar errores en tiempo de ejecución, marque los nuevos miembros de la interfaz como static.
CA2258: No se admite proporcionar una interfaz 'DynamicInterfaceCastableImplementation' en Visual Basic Para proporcionar una interfaz funcional que tiene como atributo DynamicInterfaceCastableImplementationAttribute hace falta la característica "Miembros de interfaz predeterminados", que no se admite en Visual Basic.
CA2259: Asegúrese de que ThreadStatic solo se usa con campos estáticos ThreadStaticAttribute solo afecta a los campos static (Shared en Visual Basic). Cuando se aplica a los campos de instancia, el atributo no tiene ningún impacto en el comportamiento.
CA2260: Implementación correcta de interfaces matemáticas genéricas Las interfaces matemáticas genéricas requieren que se use el tipo derivado para el parámetro de tipo autoperiódico.
CA2261: No usar ConfigureAwaitOptions.SuppressThrowing con Task<TResult> La opción ConfigureAwaitOptions.SuppressThrowing no es compatible con el genérico Task<TResult>, ya que podría dar lugar a devolver un valor no válido TResult.
CA2262: establecimiento correcto de MaxResponseHeadersLength Asegúrese de que el valor MaxResponseHeadersLength se proporciona correctamente. Este valor se mide en kilobytes.
CA2263: preferir sobrecarga genérica cuando se conoce el tipo El uso de una sobrecarga genérica es preferible pasar un System.Type argumento cuando se conoce el tipo, ya que promueven código más limpio y seguro para tipos con comprobaciones mejoradas en tiempo de compilación.
CA2264: No pasar un valor que no acepta valores NULL a 'ArgumentNullException.ThrowIfNull' 'ArgumentNullException.ThrowIfNull' se produce cuando el argumento pasado es 'null'. Algunas construcciones como estructuras que no aceptan valores NULL y 'nameof()' y 'new' nunca se conocen como null, por lo que nunca se producirá 'ArgumentNullException.ThrowIfNull'.
CA2300: No usar el deserializador no seguro BinaryFormatter Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2301: No llamar a BinaryFormatter.Deserialize sin establecer primero BinaryFormatter.Binder Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2302: Asegurarse de que BinaryFormatter.Binder está establecido antes de llamar a BinaryFormatter.Deserialize Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2305: No usar el deserializador no seguro LosFormatter Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2310: No usar el deserializador no seguro NetDataContractSerializer Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2311: No deserializar sin establecer primero NetDataContractSerializer.Binder Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2312: Asegúrese de que se establece NetDataContractSerializer.Binder antes de deserializar Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2315: No usar el deserializador no seguro ObjectStateFormatter Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2321: No deserializar con JavaScriptSerializer mediante SimpleTypeResolver Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2322: Asegúrese de que JavaScriptSerializer no se ha inicializado con SimpleTypeResolver antes de deserializar Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2326: No usar valores TypeNameHandling que no sean None Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2327: No usar valores JsonSerializerSettings no seguros Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2328: Asegurarse de que los valores JsonSerializerSettings sean seguros Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2329: No deserializar con JsonSerializer y una configuración no segura Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2330: Asegurarse de que la configuración de JsonSerializer es segura al deserializar Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados para insertar objetos con efectos secundarios malintencionados.
CA2350: Asegurarse de que la entrada de DataTable.ReadXml() sea de confianza Al deserializar un DataTable con una entrada que no es de confianza, un atacante puede crear una entrada malintencionada para realizar un ataque por denegación de servicio. Puede haber vulnerabilidades de ejecución de código remoto desconocidas.
CA2351: Asegúrese de que la entrada de DataSet.ReadXml() sea de confianza Al deserializar un DataSet con una entrada que no es de confianza, un atacante puede crear una entrada malintencionada para realizar un ataque por denegación de servicio. Puede haber vulnerabilidades de ejecución de código remoto desconocidas.
CA2352: Un objeto DataSet o DataTable no seguro en un tipo serializable puede ser vulnerable a ataques de ejecución de código remoto Una clase o estructura marcada con SerializableAttribute contiene una propiedad o un campo DataSet o DataTable, y no tiene un GeneratedCodeAttribute.
CA2353: Objeto DataSet o DataTable no seguro en un tipo serializable Una clase o estructura marcada con un atributo de serialización XML o un atributo de contrato de datos contiene una propiedad o un campo DataSet o DataTable.
CA2354: Un objeto DataSet o DataTable no seguro en un gráfico de objetos deserializado puede ser vulnerable a ataques de ejecución de código remoto La deserialización con un System.Runtime.Serialization.IFormatter serializado y el gráfico de objetos del tipo convertido pueden incluir DataSet o DataTable.
CA2355: Objeto DataSet o DataTable no seguro en un gráfico de objetos deserializado La deserialización con el gráfico de objetos del tipo convertido o especificado pueden incluir DataSet o DataTable.
CA2356: Unsafe DataSet or DataTable in web deserialized object graph (DataTable o DataSet no seguro en un gráfico de objetos deserializado web) Un método con System.Web.Services.WebMethodAttribute o System.ServiceModel.OperationContractAttribute tiene un parámetro que puede hacer referencia a DataSet o DataTable.
CA2361: Asegurarse de que la clase autogenerada que contiene DataSet.ReadXml() no se utilice con datos que no son de confianza Al deserializar un DataSet con una entrada que no es de confianza, un atacante puede crear una entrada malintencionada para realizar un ataque por denegación de servicio. Puede haber vulnerabilidades de ejecución de código remoto desconocidas.
CA2362: Un elemento DataSet o DataTable no seguro en un tipo serializable autogenerado puede ser vulnerable a ataques de ejecución remota de código Si se deserializa la entrada que no es de confianza con BinaryFormatter y el gráfico de objetos deserializados contiene DataSet o DataTable, un atacante puede crear una carga malintencionada para realizar un ataque de ejecución de código remoto.
CA3001: Revisión de código en busca de vulnerabilidades de inyección de SQL Al trabajar con comandos SQL y de entrada que no son de confianza, tenga en cuenta los ataques por inyección de SQL. Un ataque por inyección de SQL puede ejecutar comandos SQL malintencionados y poner en peligro la seguridad y la integridad de la aplicación.
CA3002: Revisión de código en busca de vulnerabilidades de XSS Al trabajar con una entrada que no es de confianza desde solicitudes web, tenga en cuenta los ataques de scripting entre sitios (XSS). Un ataque XSS inyecta entradas que no son de confianza en salidas HTML sin procesar, lo cual permite al atacante ejecutar scripts malintencionados o modificar contenido de forma malintencionada en la página web.
CA3003: Revisión de código en busca de vulnerabilidades de inyección de rutas de acceso a archivos Al trabajar con una entrada que no es de confianza desde solicitudes web, piense en usar entradas controladas por el usuario al especificar las rutas de acceso a los archivos.
CA3004: Revisión de código en busca de vulnerabilidades de divulgación de información Al revelar la información de la excepción, se ofrece a los atacantes información sobre el funcionamiento interno de la aplicación, y esto puede ayudar a los atacantes a encontrar otras vulnerabilidades para aprovechar.
CA3005: Revisión del código para detectar vulnerabilidades de inyección ldap Cuando trabaje con una entrada que no sea de confianza, tenga en cuentan los ataques por inyección del protocolo ligero de acceso a directorios (LDAP). Un atacante podría ejecutar instrucciones LDAP malintencionadas en directorios de información. Las aplicaciones que usan la entrada del usuario para construir instrucciones LDAP dinámicas para acceder a los servicios de directorio son especialmente vulnerables.
CA3006: Revisión de código en busca de vulnerabilidades de inyección de comandos de procesos Al trabajar con una entrada que no es de confianza, tenga en cuenta los ataques por inyección de comandos. Un ataque por inyección de comandos puede ejecutar comandos malintencionados en el sistema operativo subyacente, lo que pone en peligro la seguridad y la integridad del servidor.
CA3007: Revisión de código en busca de vulnerabilidades de redireccionamiento abierto Al trabajar con una entrada que no es de confianza, tenga en cuenta las vulnerabilidades de redireccionamiento abierto. Un atacante puede aprovechar una vulnerabilidad de redireccionamiento abierto para usar el sitio web con el fin de dar la apariencia de una dirección URL legítima, pero por contra redirigir a un visitante que no sospecha el engaño a una página web de phishing o de otro tipo malintencionada.
CA3008: Revisión de código en busca de vulnerabilidades de inyección de XPath Al trabajar con una entrada que no es de confianza, tenga en cuenta los ataques por inyección de XPath. La construcción de consultas XPath mediante una entrada que no es de confianza puede permitir a un atacante manipular de forma malintencionada la consulta para devolver un resultado no querido y, posiblemente, divulgar el contenido del XML consultado.
CA3009: Revisión de código en busca de vulnerabilidades de inyección de XML Al trabajar con una entrada que no es de confianza, tenga en cuenta los ataques por inyección de XML.
CA3010: Revisión de código en busca de vulnerabilidades de inyección de XAML Al trabajar con una entrada que no es de confianza, tenga en cuenta los ataques por inyección de XAML. XAML es un lenguaje de marcado que representa directamente la creación de instancias y la ejecución de objetos. Esto significa que los elementos creados en XAML pueden interactuar con los recursos del sistema (por ejemplo, el acceso a la red y la E/S del sistema de archivos).
CA3011: Revisión de código en busca de vulnerabilidades de inyección de DLL Al trabajar con una entrada que no es de confianza, tenga en cuenta la carga de código que no es de confianza. Si la aplicación web carga código que no es de confianza, es posible que un atacante pueda insertar archivos DLL malintencionados en el proceso y ejecutar código malintencionado.
CA3012: Revisión de código en busca de vulnerabilidades de inyección de expresiones regulares Al trabajar con una entrada que no es de confianza, tenga en cuenta los ataques por inyección de regex. Un atacante puede usar la inyección de regex para modificar de forma malintencionada una expresión regular, para hacer que regex coincida con los resultados imprevistos o para hacer que regex tenga un consumo de CPU excesivo que produzca un ataque por denegación de servicio.
CA3061: No agregar esquema por dirección URL No use la sobrecarga no segura del método Add porque puede provocar referencias externas peligrosas.
CA3075: Procesamiento no seguro de DTD Si usa instancias de DTDProcessing inseguras o hace referencia a orígenes de entidades externas, el analizador podría aceptar entradas que no sean de confianza y revelar información confidencial a atacantes.
CA3076: Ejecución del script XSLT no segura Si ejecuta el lenguaje de transformación basado en hojas de estilo (XSLT) en aplicaciones .NET de forma insegura, el procesador podría resolver referencias de URI que no sean de confianza y que podrían revelar información confidencial a los atacantes, lo que provocaría ataques por denegación de servicio y entre sitios.
CA3077: Procesamiento no seguro en el diseño de una API, documento XML y lector de texto XML Al diseñar una API derivada de XMLDocument y XMLTextReader, tenga en cuenta la propiedad DtdProcessing. El uso de instancias de DTDProcessing inseguras al hacer referencia a orígenes de entidades externas o resolverlos, o la definición de valores inseguros en el lenguaje XML puede provocar la divulgación de información.
CA3147: Marcar los controladores de verbo con ValidateAntiForgeryToken Al diseñar un controlador ASP.NET MVC, tenga en cuenta los ataques de falsificación de solicitudes entre sitios. Un ataque al de falsificación de solicitud entre sitios puede enviar solicitudes malintencionadas desde un usuario autenticado a un controlador ASP.NET MVC.
CA5350: No usar algoritmos criptográficos no seguros Las funciones hash y los algoritmos de cifrado débiles se usan hoy en día para numerosos propósitos, pero no se recomiendan para garantizar la confidencialidad o la integridad de los datos que se protegen. Esta regla se desencadena cuando se encuentran los algoritmos TripleDES, SHA1 o RIPEMD160 en el código.
CA5351: No usar algoritmos criptográficos dañados Los algoritmos criptográficos rotos no se consideran seguros y debe desalentarse su uso. Esta regla se desencadena cuando encuentra el algoritmo hash MD5 o los algoritmos de cifrado DES o RC2 en el código.
CA5358: No usar modos de cifrado inseguro No usar modos de cifrado inseguro
CA5359: No deshabilitar la validación de certificado Un certificado puede ayudar a autenticar la identidad del servidor. Los clientes deben validar el certificado del servidor para asegurarse de que las solicitudes se envían al servidor previsto. Si ServerCertificateValidationCallback siempre devuelve true, cualquier certificado pasará la validación.
CA5360: No llamar a métodos peligrosos durante la deserialización La deserialización no segura es una vulnerabilidad que se produce cuando los datos que no son de confianza se usan para realizar un uso indebido de la lógica de una aplicación, provocar un ataque por denegación de servicio (DoS) o incluso ejecutar código arbitrario cuando se deserializa. A menudo, es posible que los usuarios malintencionados usen indebidamente estas características de deserialización cuando la aplicación está deserializando datos que no son de confianza y están bajo su control. En concreto, la invocación de métodos peligrosos en el proceso de deserialización. Los ataques de deserialización no segura realizados correctamente pueden permitir que un atacante lleve a cabo ataques como ataques DoS, omisiones de autenticación y ejecución remota de código.
CA5361: No deshabilitar el uso de cifrado seguro de Schannel Establecer Switch.System.Net.DontEnableSchUseStrongCrypto en true debilita la criptografía usada en las conexiones de seguridad de la capa de transporte (TLS) salientes. Una criptografía más débil puede poner en peligro la confidencialidad de la comunicación entre la aplicación y el servidor, facilitando a los atacantes la interceptación de información confidencial.
CA5362: Ciclo de referencia potencial en gráfico de objetos deserializados Si se deserializan los datos que no son de confianza, el procesamiento de código del gráfico de objetos deserializados debe controlar los ciclos de referencia sin entrar en bucles infinitos. Esto incluye código que forma parte de una devolución de llamada de deserialización y código que procesa el gráfico de objetos una vez completada la deserialización. De otro modo, un atacante podría realizar un ataque por denegación de servicio con datos malintencionados que contuvieran un ciclo de referencia.
CA5363: No deshabilitar la validación de solicitudes La validación de solicitudes es una característica de ASP.NET que examina solicitudes HTTP y determina si contienen contenido potencialmente peligroso que pueda generar ataques de inyección, incluido el scripting entre sitios.
CA5364: No usar protocolos de seguridad en desuso La seguridad de la capa de transporte (TLS) protege la comunicación entre equipos, normalmente con el protocolo HTTPS. Las versiones de protocolo anteriores de TLS son menos seguras que TLS 1.2 y TLS 1.3 y es más probable que tengan nuevas vulnerabilidades. Evite las versiones anteriores del protocolo, para minimizar el riesgo.
CA5365: No deshabilitar la comprobación de encabezados HTTP La comprobación de encabezados HTTP permite codificar el retorno de carro y los caracteres de nueva línea, \r y \n, que se encuentran en los encabezados de respuesta. Esta codificación puede ayudar a evitar ataques de inyección que aprovechan una aplicación que repite datos que no son de confianza contenidos en el encabezado.
CA5366: Utilizar XmlReader para el XML de lectura de DataSet Mediante el uso de DataSet para leer código XML con datos en los que no se confía, se pueden cargar referencias externas peligrosas, que se deben restringir usando XmlReader con una resolución segura o con el procesamiento de DTD deshabilitado.
CA5367: No serializar los tipos con campos de puntero Esta regla comprueba si hay una clase serializable con una propiedad o un campo de puntero. Los miembros que no se pueden serializar pueden ser un puntero, como los miembros estáticos o los campos marcados con NonSerializedAttribute.
CA5368: Establecer ViewStateUserKey para clases derivadas de página El establecimiento de la propiedad ViewStateUserKey puede ayudarle a evitar ataques en la aplicación al permitirle asignar un identificador a la variable de estado de vista de usuarios individuales para que los atacantes no puedan usar la variable para generar un ataque. De lo contrario, habrá vulnerabilidades en la falsificación de solicitudes entre sitios.
CA5369: Usar XmlReader para deserializar El procesamiento de esquemas XML y DTD que no son de confianza puede habilitar la carga de referencias externas peligrosas, que se deben restringir mediante un XmlReader con un solucionador seguro o con el procesamiento de esquemas en línea XML y DTD deshabilitado.
CA5370: Usar XmlReader para validar el lector El procesamiento de esquemas XML y DTD que no son de confianza puede habilitar la carga de referencias externas peligrosas. Esta carga peligrosa se puede restringir mediante el uso de un XmlReader con un solucionador seguro o con el procesamiento de esquemas en línea XML y DTD deshabilitado.
CA5371: Usar XmlReader para leer el esquema El procesamiento de esquemas XML y DTD que no son de confianza puede habilitar la carga de referencias externas peligrosas. El uso de un XmlReader con un solucionador seguro o con el procesamiento de esquemas en línea XML y DTD deshabilitado lo restringe.
CA5372: Usar XmlReader para XPathDocument El procesamiento de XML a partir de datos que no son de confianza puede cargar referencias externas peligrosas, que se pueden restringir mediante un XmlReader con un solucionador seguro o con el procesamiento de DTD deshabilitado.
CA5373: No usar la función de derivación de clave obsoleta Esta regla detecta la invocación de métodos de derivación de claves débiles System.Security.Cryptography.PasswordDeriveBytes y Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes usaba un algoritmo débil PBKDF1.
CA5374: No utilizar XslTransform Esta regla comprueba si se crean instancias de System.Xml.Xsl.XslTransform en el código. System.Xml.Xsl.XslTransform ahora está obsoleto y no debe usarse.
CA5375: No usar la firma de acceso compartido de la cuenta Una SAS de cuenta puede delegar el acceso para leer, escribir y eliminar operaciones en contenedores de blobs, tablas, colas y recursos compartidos de archivos que no están permitidos con SAS de servicio. Sin embargo, no es compatible con las directivas de nivel de contenedor y tiene menos flexibilidad y control sobre los permisos que se conceden. Una vez que los usuarios malintencionados la obtengan, la cuenta de almacenamiento estará en peligro fácilmente.
CA5376: Usar HttpsOnly con SharedAccessProtocol SAS es información confidencial que no se puede transportar en texto sin formato en HTTP.
CA5377: Usar una directiva de acceso de nivel de contenedor Una directiva de acceso de nivel de contenedor se puede modificar o revocar en cualquier momento. Proporciona mayor flexibilidad y control sobre los permisos que se conceden.
CA5378: No deshabilitar ServicePointManagerSecurityProtocols Establecer Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols en true limita las conexiones de seguridad de la capa de transporte (TLS) de Windows Communication Framework (WCF) al uso de TLS 1.0. Esa versión de TLS quedará en desuso.
CA5379: No use el algoritmo de función de derivación de claves débiles De forma predeterminada, la clase Rfc2898DeriveBytes usa el algoritmo SHA1. Debe especificar el algoritmo hash que se utilizará en algunas sobrecargas del constructor con SHA256 o superior. Tenga en cuenta que la propiedad HashAlgorithm solo tiene un descriptor de acceso get y no tiene un modificador overridden.
CA5380: No agregar certificados al almacén raíz Esta regla detecta código que agrega un certificado al almacén de certificados de entidades de certificación raíz de confianza. De forma predeterminada, el almacén de certificados de entidades de certificación raíz de confianza se configura con un conjunto de entidades de certificación públicas que cumplen los requisitos del Programa de certificados raíz de Microsoft.
CA5381: Asegurar que no se agregan certificados al almacén raíz Esta regla detecta código que puede agregar un certificado al almacén de certificados de entidades de certificación raíz de confianza. De forma predeterminada, el almacén de certificados de entidades de certificación raíz de confianza se configura con un conjunto de entidades de certificación (CA) públicas que cumplen los requisitos del Programa de certificados raíz de Microsoft.
CA5382: Usar cookies seguras en ASP.NET Core Las aplicaciones disponibles por medio de HTTPS deben usar cookies seguras, que indican al navegador que la cookie solo se debe transmitir mediante Capa de sockets seguros (SSL).
CA5383: Asegurarse de usar cookies seguras en ASP.NET Core Las aplicaciones disponibles por medio de HTTPS deben usar cookies seguras, que indican al navegador que la cookie solo se debe transmitir mediante Capa de sockets seguros (SSL).
CA5384: No usar el algoritmo de firma digital (DSA) DSA es un algoritmo de cifrado asimétrico débil.
CA5385: Usar un algoritmo de Rivest-Shamir-Adleman (RSA) con un tamaño de clave suficiente Una clave RSA de menos de 2048 bits es más vulnerable a los ataques por fuerza bruta.
CA5386: Evitar codificar el valor SecurityProtocolType de forma rígida La seguridad de la capa de transporte (TLS) protege la comunicación entre equipos, normalmente con el protocolo HTTPS. Las versiones de protocolo TLS 1.0 y TLS 1.1 están en desuso, mientras que las versiones TLS 1.2 y TLS 1.3 están actualizadas. En el futuro, TLS 1.2 y TLS 1.3 pueden quedar en desuso. Para asegurarse de que la aplicación sigue siendo segura, evite codificar una versión del protocolo y tenga como objetivo al menos .NET Framework 4.7.1.
CA5387: No usar una función de derivación de claves débiles con un recuento de iteraciones insuficiente Esta regla comprueba si se generó una clave criptográfica Rfc2898DeriveBytes con un recuento de iteraciones inferior a 100 000. Un recuento de iteraciones mayor puede ayudar a mitigar los ataques de diccionario que intentan adivinar la clave criptográfica generada.
CA5388: Garantizar un recuento de iteraciones suficiente al usar una función de derivación de claves débiles Esta regla comprueba si Rfc2898DeriveBytes generó una clave criptográfica con un recuento de iteraciones inferior a 100 000. Un recuento de iteraciones mayor puede ayudar a mitigar los ataques de diccionario que intentan adivinar la clave criptográfica generada.
CA5389: No agregar la ruta de acceso del elemento de archivo a la ruta de acceso del sistema de archivos de destino La ruta de acceso de archivo puede ser relativa y puede dar lugar a un acceso al sistema de archivos fuera de la ruta de destino del sistema de archivos esperada, con una generación de cambios de configuración malintencionados y la ejecución remota de código mediante la técnica conocida como "lay-and-wait".
CA5390: No codificar la clave de cifrado de forma rígida Para que un algoritmo simétrico se realice correctamente, solo el remitente y el receptor deben conocer la clave secreta. Cuando una clave está codificada de forma rígida, se detecta fácilmente. Incluso con los archivos binarios compilados, es fácil que los usuarios malintencionados logren la extracción. Una vez que la clave privada está en peligro, el texto cifrado se puede descifrar directamente y ya no está protegido.
CA5391: Usar tokens antifalsificación en los controladores de ASP.NET Core MVC El control de una solicitud POST, PUT, PATCH o DELETE sin validar un token antifalsificación puede ser vulnerable a ataques de falsificación de solicitud entre sitios. Un ataque de falsificación de solicitud entre sitios puede enviar solicitudes malintencionadas desde un usuario autenticado a un controlador de ASP.NET Core MVC.
CA5392: Usar el atributo DefaultDllImportSearchPaths para P/Invoke De forma predeterminada, las funciones P/Invoke que usan DllImportAttribute sondean un número de directorios, incluido el directorio de trabajo actual de la biblioteca que se va a cargar. Puede tratarse de un problema de seguridad para ciertas aplicaciones, que conducirá al secuestro de DLL.
CA5393: No usar un valor de DllImportSearchPath no seguro Podría haber un archivo DLL malintencionado en los directorios de ensamblado y los directorios de búsqueda DLL predeterminados. O, en función de dónde se ejecute la aplicación, podría haber un archivo DLL malintencionado en el directorio de la aplicación.
CA5394: No usar aleatoriedad no segura El uso de un generador de números pseudoaleatorios no seguro criptográficamente puede permitir que un atacante prediga qué valor de seguridad se generará.
CA5395: Falta el atributo HttpVerb para los métodos de acción Todos los métodos de acción que crean, editan, eliminan o modifican de algún otro modo los datos deben protegerse con el atributo antifalsificación de los ataques de falsificación de solicitudes entre sitios. Realizar una operación GET debería ser una operación segura sin efectos secundarios, que no modifica los datos persistentes.
CA5396: Establecer HttpOnly en true para HttpCookie Como medida de defensa en profundidad, asegúrese de que las cookies HTTP confidenciales de seguridad estén marcadas como HttpOnly. Esto indica que los navegadores web deben impedir que los scripts accedan a las cookies. Los scripts malintencionados insertados son una forma habitual de robar cookies.
CA5397: No usar valores SslProtocols en desuso La seguridad de la capa de transporte (TLS) protege la comunicación entre equipos, normalmente con el protocolo HTTPS. Las versiones de protocolo anteriores de TLS son menos seguras que TLS 1.2 y TLS 1.3 y es más probable que tengan nuevas vulnerabilidades. Evite las versiones anteriores del protocolo, para minimizar el riesgo.
CA5398: Evitar valores SslProtocols codificados de forma rígida La seguridad de la capa de transporte (TLS) protege la comunicación entre equipos, normalmente con el protocolo HTTPS. Las versiones de protocolo TLS 1.0 y TLS 1.1 están en desuso, mientras que las versiones TLS 1.2 y TLS 1.3 están actualizadas. En el futuro, TLS 1.2 y TLS 1.3 pueden quedar en desuso. Para asegurarse de que la aplicación sigue siendo segura, evite codificar de forma rígida una versión del protocolo.
CA5399: Deshabilitar definitivamente la comprobación de la lista de revocación de certificados HttpClient Un certificado revocado deja de ser de confianza. Podría ser utilizado por los atacantes para pasar algunos datos malintencionados o robar datos confidenciales en la comunicación HTTPS.
CA5400: Garantizar que la comprobación de la lista de revocación de certificados HttpClient no está deshabilitada Un certificado revocado deja de ser de confianza. Podría ser utilizado por los atacantes para pasar algunos datos malintencionados o robar datos confidenciales en la comunicación HTTPS.
CA5401: No usar CreateEncryptor con un vector de inicialización no predeterminado La clave de cifrado simétrica debe usar siempre un vector de inicialización que no se repita para evitar los ataques por diccionario.
CA5402: Usar CreateEncryptor con el vector de inicialización predeterminado La clave de cifrado simétrica debe usar siempre un vector de inicialización que no se repita para evitar los ataques por diccionario.
CA5403: No codificar el certificado de forma rígida El parámetro data o rawData de un constructor X509Certificate o X509Certificate2 está codificado de forma rígida.
CA5404: No deshabilitar las comprobaciones de validación de tokens Las propiedades de TokenValidationParameters que controlan la validación de tokens no deben establecerse en false.
CA5405: No omitir siempre la validación de tokens en delegados La devolución de llamada asignada a AudienceValidator o LifetimeValidator siempre devuelve true.
IL3000 Evite acceder a la ruta de acceso de archivo de ensamblado al publicar como único archivo Evite acceder a la ruta del archivo de ensamblado al publicar como único archivo.
IL3001 Evite acceder a la ruta de acceso de archivo de ensamblado al publicar como único archivo Evite acceder a la ruta del archivo de ensamblado al publicar como único archivo.
IL3002 Evite llamar a miembros anotados con "RequiresAssemblyFilesAttribute" en una publicación como un archivo único. Evite llamar a miembros anotados con "RequiresAssemblyFilesAttribute" en una publicación como archivo único.
IL3003: Las anotaciones "RequiresAssemblyFilesAttribute" deben coincidir en todas las invalidaciones o implementaciones de interfaz Las anotaciones "RequiresAssemblyFilesAttribute" deben coincidir en todas las invalidaciones o implementaciones de interfaz.

Leyenda

En la tabla siguiente se muestra el tipo de información que se proporciona para cada regla en la documentación de referencia.

Elemento Descripción
Tipo TypeName de la regla.
Identificador de la regla Identificador único de la regla. Identificador de la regla y Categoría se usan para la supresión en el código fuente de una advertencia.
Categoría Categoría de la regla, por ejemplo, seguridad.
La corrección es problemática o no problemática Indica si la corrección para una infracción de la regla es un cambio problemático. Se entiende por cambio problemático que un ensamblado que tenga una dependencia en el destino que produjo la infracción no se vuelva a compilar con la nueva versión modificada o genere un error en tiempo de ejecución debido al cambio. Cuando hay varias correcciones disponibles y al menos una es un cambio importante y otra no, se especifican "Importante" y "No importante".
Causa El código administrado específico que provoca que la regla genere una advertencia.
Descripción Describe los problemas que están detrás de la advertencia.
Cómo corregir infracciones Explica cómo cambiar el código fuente para cumplir la regla y evitar que se genere una advertencia.
Cuándo suprimir las advertencias Describe cuándo es seguro suprimir una advertencia de la regla.
Ejemplo de código Ejemplos que infringen la regla y ejemplos corregidos que cumplen la regla.
Reglas relacionadas Reglas relacionadas.