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:
- C#: #pragma warning
- Visual Basic: Deshabilitar advertencia
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:
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.
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.
Si elige En origen (atributo), verá una vista previa del atributo SuppressMessageAttribute que se agregará al código.
Supresión de infracciones mediante la ventana Lista de errores
Para suprimir infracciones mediante la ventana Lista de errores, siga estos pasos:
En la ventana Lista de errores, seleccione las reglas que desea suprimir.
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.
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:
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.
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:
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.
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:
En la ventana Lista de errores, seleccione las reglas que desea suprimir.
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.
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:
En la barra de menús de Visual Studio, seleccione Analizar>Compilar y suprimir problemas activos.
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:
Desde el Explorador de soluciones, seleccione el proyecto.
Haga clic con el botón derecho y, a continuación, seleccione Propiedades (o presione Alt + Entrar).
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:
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.
Seleccione Suprimir o configurar problemas>Suprimir <número de regla> en el menú Acciones rápidas.
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 esCAXXXX
; el nombre largo esCAXXXX: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 valornamespaceanddescendants
.
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.