Supresión de infracciones de análisis de código

Si colabora con su equipo a medida que crea el código, a menudo resulta útil indicar que una advertencia no es aplicable. La supresión de infracciones de análisis de código indica a los miembros del equipo que se ha revisado el código y que se puede suprimir la advertencia. En las secciones siguientes se describen las distintas formas de suprimir las infracciones de análisis de código mediante el IDE de Visual Studio.

Supresión de infracciones mediante el archivo EditorConfig

En el archivo EditorConfig de la solución o proyecto, agregue una entrada para cada regla que quiera configurar y establezca su gravedad en none. Por ejemplo, dotnet_diagnostic.CA1822.severity = none. Para obtener más información, vea Configuración manual de la gravedad de la regla en un archivo EditorConfig. Para agregar un archivo EditorConfig, consulte Incorporación de un archivo EditorConfig a un proyecto.

Supresión de infracciones en el código fuente

Puede suprimir infracciones en el código fuente mediante una directiva de preprocesador, que suprime las infracciones de una línea de código específica:

O bien, puede utilizar el atributo SuppressMessageAttribute para suprimir una advertencia en el código de C# y Visual Basic.

Supresión de infracciones mediante el editor de código

Para suprimir infracciones mediante el editor de código, siga estos pasos:

  1. Coloque el cursor en la línea de código con la infracción y presione Ctrl+Punto (.) o Alt+Entrar para abrir el menú Acciones rápidas.

  2. Seleccione Suprimir o configurar problemas>Suprimir <número de regla> y, a continuación, elija En origen o En origen (atributo).

    • Si elige En origen, verá una vista previa de la directiva de preprocesador que se agregará al código.

      Captura de pantalla que muestra la selección “En origen”, en el menú de supresión de “Acciones rápidas”.

    • Si elige En origen (atributo), verá una vista previa del atributo SuppressMessageAttribute que se agregará al código.

      Captura de pantalla que muestra la selección “En origen (atributo)”, en el menú de supresión de “Acciones rápidas”.

Supresión de infracciones mediante la ventana Lista de errores

Para suprimir infracciones mediante la ventana Lista de errores, siga estos pasos:

  1. En la ventana Lista de errores, seleccione las reglas que desea suprimir.

  2. Haga clic con el botón derecho y seleccione Suprimir>En origen.

    Se abrirá el cuadro de diálogo Vista previa de los cambios, donde se muestra una vista previa de la directiva #pragma warning o de la directiva #Disable warning (Visual Basic) que se agrega al código fuente.

    Captura de pantalla que muestra el cuadro de diálogo “Vista previa de los cambios” para agregar #pragma warning en el archivo de código.

  3. Seleccione Aplicar para guardar los cambios en el archivo de código.

Excluir diagnósticos de compilación de la ventana Lista de errores

Si no ve la opción de menú Suprimir en la ventana Lista de errores, es probable que la infracción provenga de una compilación y no del análisis en directo. La ventana Lista de errores muestra diagnósticos (o infracciones de reglas) procedentes tanto del análisis de código en directo como de las compilaciones. Como los diagnósticos de compilación pueden estar obsoletos (por ejemplo, porque se haya editado el código para corregir la infracción, pero no se haya vuelto a compilar), estos diagnósticos no siempre se pueden suprimir de la ventana Lista de errores.

Los diagnósticos procedentes del análisis en directo, o IntelliSense, siempre están actualizados con los orígenes actuales y sí se pueden suprimir siempre de la ventana Lista de errores. Para excluir los diagnósticos de compilación de la selección, siga estos pasos:

  1. En la lista desplegable del filtro de origen de la ventana Lista de errores, cambie la selección de Compilación + IntelliSense a Solo IntelliSense.

    Captura de pantalla en la que se muestra el filtro de origen de la ventana “Lista de errores”.

  2. Seleccione los diagnósticos que quiera suprimir y continúe del modo descrito arriba.

Supresión de infracciones mediante un archivo de supresión global

El archivo de supresión global utiliza el atributo SuppressMessage para suprimir las infracciones de código.

Uso de un archivo de supresión global desde el editor de código

Para suprimir infracciones con un archivo de supresión global mediante el editor de código, siga estos pasos:

  1. En el editor de código, coloque el cursor en la línea de código que tenga la infracción y presione Ctrl+Punto (.) o Alt+Entrar para abrir el menú Acciones rápidas.

  2. Seleccione Suprimir número de regla <> y elija En archivo de supresión.

    Visual Studio crea una pestaña en el editor de código que contiene el nuevo archivo de supresión global.

Uso de un archivo de supresión global de la ventana Lista de errores

Para suprimir infracciones con un archivo de supresión global mediante la ventana Lista de errores, siga estos pasos:

  1. En la ventana Lista de errores, seleccione las reglas que desea suprimir.

  2. Haga clic con el botón derecho y seleccione Suprimir>En archivo de supresión.

    Se abre el cuadro de diálogo Vista previa de los cambios, donde se muestra una vista previa del atributo SuppressMessageAttribute que se agrega al archivo de supresión global.

    Captura de pantalla que muestra el cuadro de diálogo “Vista previa de los cambios” con un atributo SuppressMessageAttribute en el archivo de supresión.

  3. Seleccione Aplicar para guardar el archivo de supresión global.

Supresión de todas las infracciones actuales

La supresión de todas las infracciones actuales se conoce a veces como línea de base. Para suprimir todas las infracciones actuales de una solución o proyecto, siga estos pasos:

  1. En la barra de menús de Visual Studio, seleccione Analizar>Compilar y suprimir problemas activos.

  2. Seleccione Para la solución si desea suprimir las infracciones de toda la solución, o bien Para <nombre del proyecto> si lo que busca es suprimir las infracciones para el proyecto exclusivamente.

Supresión de infracciones mediante la configuración del proyecto

Para suprimir infracciones mediante la configuración de proyecto del Explorador de soluciones, siga estos pasos:

  1. Desde el Explorador de soluciones, seleccione el proyecto.

  2. Haga clic con el botón derecho y, a continuación, seleccione Propiedades (o presione Alt + Entrar).

  3. En la ventana Propiedades , seleccione Code Analysis en el panel izquierdo y, a continuación, desactive Suprimir los resultados del código generado.

Supresión de infracciones mediante un conjunto de reglas

En el editor del conjunto de reglas, desactive la casilla situada junto a su nombre o establezca Acción en Ninguno.

Supresión en origen y atributo SuppressMessageAttribute

La supresión en origen usa el atributo SuppressMessageAttribute para suprimir una advertencia. Puede agregar el atributo SuppressMessageAttribute al archivo de origen cerca del segmento de código que generó la advertencia.

Puede introducir el atributo manualmente en el editor de código o agregar el atributo automáticamente de la siguiente manera:

  1. En el editor de código, coloque el cursor en la línea de código que tenga la infracción y presione Ctrl+Punto (.) o Alt+Entrar para abrir el menú Acciones rápidas.

  2. Seleccione Suprimir o configurar problemas>Suprimir <número de regla> en el menú Acciones rápidas.

  3. Realice uno de los siguientes pasos:

    • Seleccione En origen (atributo).

      Visual Studio agregará un atributo SuppressMessageAttribute al código.

    • Seleccione en archivo de supresión.

      Visual Studio crea una pestaña en el editor de código que contiene un nuevo archivo de supresión global con atributos SuppressMessageAttribute.

El atributo SuppressMessageAttribute es condicional y se incluye en los metadatos del ensamblado de código administrado. Este atributo solo se incluye si el símbolo de compilación CODE_ANALYSIS se define en tiempo de compilación.

De manera exclusiva en el código de C++ y CLI, puede utilizar las macros CA_SUPPRESS_MESSAGE o CA_GLOBAL_SUPPRESS_MESSAGE en el archivo de encabezado para agregar el atributo.

Si migra un proyecto a la última versión de Visual Studio, es posible que se encuentre con un gran número de advertencias de análisis de código. Si no está listo para corregir las advertencias, puede suprimirlas todas. Para ello, seleccione Analizar>Compilar y suprimir problemas activos.

Nota:

No debe utilizar supresiones en origen en las compilaciones de versión, para evitar el envío accidental de los metadatos de supresión en origen.

Formato del atributo SuppressMessageAttribute

El atributo SuppressMessageAttribute tiene el formato siguiente:

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

Las propiedades del atributo incluyen las siguientes:

  • Category: categoría de la regla. Para obtener más información sobre las categorías de reglas de análisis de código, consulte Reglas de calidad del código.

  • CheckId:: el identificador de la regla. La compatibilidad incluye un nombre corto y uno largo para el identificador de regla. El nombre corto es CAXXXX; el nombre largo es CAXXXX:FriendlyTypeName.

  • Justification: texto que se utiliza para documentar el motivo por el que se suprime el mensaje.

  • MessageId: identificador único del problema para cada mensaje.

  • Scope: el destino en el que se suprime la advertencia. Si no se especifica el destino, el sistema lo establece en el destino del atributo. Entre los ámbitos admitidos se incluyen los siguientes:

    • module: este ámbito suprime las advertencias de un ensamblado. Se trata de una supresión global que se aplica a todo el proyecto.

    • resource (solo FxCop antiguo): este ámbito suprime las advertencias en la información de diagnóstico escrita en archivos de recursos que forman parte del módulo (ensamblado). Este ámbito no se lee ni se respeta en los compiladores de C#/VB para los diagnósticos del analizador de Roslyn, que solo analizan archivos de origen.

    • type: este ámbito suprime las advertencias de un tipo.

    • member: este ámbito suprime las advertencias de un miembro.

    • namespace: este ámbito suprime las advertencias del propio espacio de nombres. No suprime las advertencias de los tipos dentro del espacio de nombres.

    • namespaceanddescendants: (requiere una versión del compilador 3.x o superior y Visual Studio 2019 o posterior): este ámbito suprime las advertencias de un espacio de nombres y todos sus símbolos descendientes. El análisis antiguo omite el valor namespaceanddescendants.

  • Target: identificador que se usa para especificar el destino en el que se suprime la advertencia. Debe contener un nombre de componente completo.

Cuando aparezcan advertencias en Visual Studio, podrá ver ejemplos de SuppressMessageAttribute si agrega una supresión al archivo de supresión global. El atributo de supresión y sus propiedades necesarias aparecen en una ventana de vista previa.

Uso de SuppressMessageAttribute

Las advertencias de análisis de código se suprimen en el nivel al que se aplica el atributo SuppressMessageAttribute. Por ejemplo, el atributo se puede aplicar en el nivel de ensamblado, módulo, tipo, miembro o parámetro. El propósito de aplicar este atributo es acoplar estrechamente la información de supresión al código en el que se produce la infracción.

El formato general de supresión incluye la categoría de regla y un identificador de regla, que contiene una representación legible opcional del nombre de la regla. Por ejemplo:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

Si hay motivos de rendimiento estrictos para minimizar los metadatos de supresión en origen, se puede omitir el nombre de la regla. La categoría de regla y su identificador de regla forman juntos un identificador de regla lo suficientemente único. Por ejemplo:

[SuppressMessage("Microsoft.Design", "CA1039")]

Por motivos de mantenimiento, no se recomienda omitir el nombre de la regla.

Supresión de infracciones selectivas dentro del cuerpo de un método

Los atributos de supresión se pueden aplicar a un método, pero no se pueden insertar en el cuerpo del método. Todas las infracciones de una regla determinada se suprimen si se agrega el atributo SuppressMessageAttribute al método.

En algunos casos, es posible que le interese suprimir una instancia determinada de la infracción. Imagine, por ejemplo, que el código futuro no se excluye automáticamente de la regla de análisis de código. Algunas reglas de análisis de código permiten suprimir una instancia determinada de la infracción mediante la propiedad MessageId del atributo SuppressMessageAttribute. En general, las reglas heredadas relativas a las infracciones en un símbolo determinado (una variable local o parámetro) respetan la propiedad MessageId. Un ejemplo de esta regla es CA1500:VariableNamesShouldNotMatchFieldNames. Aun así, las reglas antiguas relativas a las infracciones en código ejecutable (no un símbolo) no respetan la propiedad MessageId. Además, los analizadores de .NET Compiler Platform ("Roslyn") no respetan la propiedad MessageId.

Para suprimir una infracción en un símbolo determinado de una regla, especifique el nombre del símbolo para la propiedad MessageId del atributo SuppressMessageAttribute. En el ejemplo siguiente se muestra el código con dos infracciones de CA1500:VariableNamesShouldNotMatchFieldNames: una infracción de la variable name y otra de la variable age. Solo se suprime la infracción del símbolo age.

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

Supresiones de nivel global

La herramienta de análisis de código administrado examina los atributos SuppressMessageAttribute que se aplican en el nivel de ensamblado, módulo, tipo, miembro o parámetro. También envía infracciones en recursos y espacios de nombres. Estas infracciones se deben aplicar a nivel global, y tienen ámbito y destino. Por ejemplo, el siguiente mensaje suprime una infracción de espacio de nombres:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

Para las supresiones de nivel global:

  • Cuando se suprime una advertencia con un ámbito namespace, se suprime la advertencia del propio espacio de nombres. No se suprime la advertencia de los tipos dentro del espacio de nombres.

  • Target siempre contiene el nombre completo del elemento.

  • Se puede expresar cualquier supresión si se especifica un ámbito explícito. Estas supresiones deben residir en el nivel global. No se puede especificar una supresión de nivel de miembro mediante la modificación de un tipo.

  • Las supresiones de nivel global son la única manera de suprimir los mensajes que hacen referencia al código generado por el compilador que no se asigna a un origen de usuario proporcionado explícitamente. Por ejemplo, el siguiente código suprime una infracción en un constructor emitido por el compilador:

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Archivo de supresión global

El archivo de supresión global contiene supresiones que son de nivel global o que no especifican un destino. Por ejemplo, aquí se almacenan las supresiones de infracciones de nivel de ensamblado. Además, algunas supresiones de ASP.NET se almacenan en este archivo porque la configuración de nivel de proyecto no está disponible para el código subyacente a un formulario. La primera vez que se selecciona la opción En archivo de supresión de proyecto del comando Suprimir en la ventana Lista de errores, se crea un archivo de supresión global que se agrega al proyecto.

Ámbito de supresión de módulo

Puede suprimir las infracciones de calidad del código para todo el ensamblado mediante el ámbito de module.

Por ejemplo, el siguiente atributo del archivo de proyecto GlobalSuppressions suprimirá la infracción ConfigureAwait para un proyecto de ASP.NET Core:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

Código generado

Los compiladores de código administrado y algunas herramientas externas generan código para ayudar al desarrollo rápido de código. El código generado por el compilador que aparece en los archivos de código fuente se marca con el atributo GeneratedCodeAttribute.

Para el análisis de código fuente, puede suprimir los mensajes en el código generado en un archivo .editorconfig. Para obtener más información, consulte Exclusión del código generado.

Para el análisis de código heredado, puede elegir si quiere suprimir las advertencias y errores de análisis de código para el código generado. Para obtener información sobre cómo suprimir estas advertencias y errores, consulte Cómo suprimir advertencias de análisis de código para el código generado.

Nota:

El análisis de código omite GeneratedCodeAttribute cuando se aplica a un ensamblado completo o a un único parámetro.