Suprimir advertencias de análisis de códigoSuppress code analysis warnings

A menudo resulta útil indicar que una advertencia no es aplicable.It is often useful to indicate that a warning is not applicable. Esto indica a los miembros del equipo que el código se ha revisado y que se puede suprimir la advertencia.This indicates to team members that the code was reviewed, and that the warning can be suppressed. La supresión en el código fuente (ISS) SuppressMessageAttribute utiliza el atributo para suprimir una advertencia.In-source suppression (ISS) uses the SuppressMessageAttribute attribute to suppress a warning. El atributo se puede colocar cerca del segmento de código que generó la advertencia.The attribute can be placed close to the code segment that generated the warning. Puede Agregar el SuppressMessageAttribute atributo al archivo de código fuente escribiéndolo en, o bien puede utilizar el menú contextual de una advertencia en el lista de errores para agregarlo automáticamente.You can add the SuppressMessageAttribute attribute to the source file by typing it in, or you can use the shortcut menu on a warning in the Error List to add it automatically.

El SuppressMessageAttribute atributo es un atributo condicional, que se incluye en los metadatos de Il del ensamblado de código administrado, solo si el símbolo de compilación CODE_ANALYSIS se define en tiempo de compilación.The SuppressMessageAttribute attribute is a conditional attribute, which is included in the IL metadata of your managed code assembly, only if the CODE_ANALYSIS compilation symbol is defined at compile time.

En C++/CLI_, use la CA de macros_Suppress Message o_SUPPRESS_MESSAGE_global de CA en el archivo de encabezado para agregar el atributo.In C++/CLI, use the macros CA_SUPPRESS_MESSAGE or CA_GLOBAL_SUPPRESS_MESSAGE in the header file to add the attribute.

Note

No debe usar supresiones en el origen en las compilaciones de versión para evitar que se envíen accidentalmente los metadatos de supresión en el código fuente.You should not use in-source suppressions on release builds, to prevent shipping the in-source suppression metadata accidentally. Además, debido al costo de procesamiento de la supresión en el código fuente, se puede degradar el rendimiento de la aplicación.Additionally, because of the processing cost of in-source suppression, the performance of your application can be degraded.

Note

Si migra un proyecto a Visual Studio 2017 o Visual Studio 2019, es posible que se enfrente a un gran número de advertencias de análisis de código.If you migrate a project to Visual Studio 2017 or Visual Studio 2019, you might suddenly be faced with a large number of code analysis warnings. Si no está listo para corregir las advertencias, puede suprimir todas ellas eligiendo analizar > Ejecutar Análisis de código y suprimir problemas activos.If you aren't ready to fix the warnings, you can suppress all of them by choosing Analyze > Run Code Analysis and Suppress Active Issues.

Ejecutar análisis de código y suprimir problemas en Visual Studio

SuppressMessage (atributo)SuppressMessage attribute

Al elegir suprimir en el menú contextual o de clic con el botón derecho de una advertencia de análisis de SuppressMessageAttribute código en el lista de errores, se agrega un atributo en el código o en el archivo de supresión global del proyecto.When you choose Suppress from the context or right-click menu of a code analysis warning in the Error List, a SuppressMessageAttribute attribute is added either in your code or to the project's global suppression file.

El SuppressMessageAttribute atributo tiene el formato siguiente:The SuppressMessageAttribute attribute has the following format:

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

Las propiedades del atributo incluyen:The properties of the attribute include:

  • Categoría : la categoría en la que se define la regla.Category - The category in which the rule is defined. Para obtener más información sobre las categorías de reglas de análisis de código, vea advertencias de código administrado.For more information about code analysis rule categories, see Managed code warnings.

  • CheckId : el identificador de la regla.CheckId - The identifier of the rule. La compatibilidad incluye un nombre corto y largo para el identificador de regla.Support includes both a short and long name for the rule identifier. El nombre corto es CAXXXX; el nombre largo es CAXXXX: FriendlyTypeName.The short name is CAXXXX; the long name is CAXXXX:FriendlyTypeName.

  • Justificación : el texto que se usa para documentar el motivo de la supresión del mensaje.Justification - The text that is used to document the reason for suppressing the message.

  • MessageId : identificador único de un problema para cada mensaje.MessageId - Unique identifier of a problem for each message.

  • Ámbito : el destino en el que se va a suprimir la advertencia.Scope - The target on which the warning is being suppressed. Si no se especifica el destino, se establece en el destino del atributo.If the target is not specified, it is set to the target of the attribute. Entre los ámbitos admitidos se incluyen los siguientes:Supported scopes include the following:

    • module

    • resource

    • type

    • member

    • namespace: Este ámbito suprime las advertencias en el espacio de nombres.namespace - This scope suppresses warnings against the namespace itself. No suprime las advertencias de los tipos dentro del espacio de nombres.It does not suppress warnings against types within the namespace.

    • namespaceanddescendants-(Novedad de Visual Studio 2019) este ámbito suprime las advertencias en un espacio de nombres y todos sus símbolos descendientes.namespaceanddescendants - (New for Visual Studio 2019) This scope suppresses warnings in a namespace and all its descendant symbols. El namespaceanddescendants análisis heredado omite el valor.The namespaceanddescendants value is ignored by legacy analysis.

  • Target : un identificador que se usa para especificar el destino en el que se va a suprimir la advertencia.Target - An identifier that is used to specify the target on which the warning is being suppressed. Debe contener un nombre de elemento completo.It must contain a fully qualified item name.

Uso de SuppressMessageSuppressMessage usage

Las advertencias de análisis de código se suprimen en el SuppressMessageAttribute nivel al que se aplica el atributo.Code Analysis warnings are suppressed at the level to which the SuppressMessageAttribute attribute is applied. Por ejemplo, el atributo se puede aplicar en el nivel de ensamblado, módulo, tipo, miembro o parámetro.For example, the attribute can be applied at the assembly, module, type, member, or parameter level. La finalidad de esto es acoplar estrechamente la información de supresión en el código donde se produce la infracción.The purpose of this is to tightly couple the suppression information to the code where the violation occurs.

La forma general de supresión incluye la categoría de regla y un identificador de regla, que contiene una representación opcional inteligible del nombre de la regla.The general form of suppression includes the rule category and a rule identifier, which contains an optional human-readable representation of the rule name. Por ejemplo:For example:

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

Si hay razones de rendimiento estrictas para minimizar los metadatos de supresión en el código fuente, se puede omitir el nombre de la regla.If there are strict performance reasons for minimizing in-source suppression metadata, the rule name can be omitted. La categoría de regla y su identificador de regla forman un identificador de regla suficientemente único.The rule category and its rule ID together constitute a sufficiently unique rule identifier. Por ejemplo:For example:

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

Por motivos de mantenimiento, no se recomienda omitir el nombre de la regla.For maintainability reasons, omitting the rule name is not recommended.

Suprimir infracciones selectivas dentro de un cuerpo de métodoSuppress selective violations within a method body

Los atributos de supresión se pueden aplicar a un método, pero no se pueden incrustar dentro de un cuerpo de método.Suppression attributes can be applied to a method, but cannot be embedded within a method body. Esto significa que todas las infracciones de una regla determinada se suprimen si SuppressMessageAttribute agrega el atributo al método.This means that all violations of a particular rule are suppressed if you add the SuppressMessageAttribute attribute to the method.

En algunos casos, puede que desee suprimir una instancia determinada de la infracción, por ejemplo, para que el código futuro no se excluya automáticamente de la regla de análisis de código.In some cases, you might want to suppress a particular instance of the violation, for example so that future code isn't automatically exempt from the code analysis rule. Ciertas reglas MessageId SuppressMessageAttribute de análisis de código permiten hacer esto mediante el uso de la propiedad del atributo.Certain code analysis rules allow you to do this by using the MessageId property of the SuppressMessageAttribute attribute. En general, las reglas heredadas para las infracciones en un símbolo determinado (una variable local o MessageId un parámetro) respetan la propiedad.In general, legacy rules for violations on a particular symbol (a local variable or parameter) respect the MessageId property. CA1500: VariableNamesShouldNotMatchFieldNames es un ejemplo de este tipo de regla.CA1500:VariableNamesShouldNotMatchFieldNames is an example of such a rule. Sin embargo, las reglas heredadas para las infracciones en código ejecutable (sin símbolo) no MessageId respetan la propiedad.However, legacy rules for violations on executable code (non-symbol) do not respect the MessageId property. Además, los analizadores de .net Compiler Platform ("Roslyn") no respetan la MessageId propiedad.Additionally, .NET Compiler Platform ("Roslyn") analyzers do not respect the MessageId property.

Para suprimir una infracción de símbolo en particular de una regla, especifique el MessageId nombre del símbolo SuppressMessageAttribute para la propiedad del atributo.To suppress a particular symbol violation of a rule, specify the symbol name for the MessageId property of the SuppressMessageAttribute attribute. En el ejemplo siguiente se muestra código con dos infracciones de CA1500: VariableNamesShouldNotMatchFieldNames—una para la name variable y age otra para la variable.The following example shows code with two violations of CA1500:VariableNamesShouldNotMatchFieldNames—one for the name variable and one for the age variable. Solo se suprime la age infracción del símbolo.Only the violation for the age symbol is suppressed.

Public Class Animal
    Dim age As Integer
    Dim name As String

    <CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId:="age")>
    Sub PrintInfo()
        Dim age As Integer = 5
        Dim name As String = "Charlie"

        Console.WriteLine("Age {0}, Name {1}", age, name)
    End Sub

End Class
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}");
    }
}

Código generadoGenerated code

Los compiladores de código administrado y algunas herramientas de terceros generan código para facilitar el desarrollo rápido de código.Managed code compilers and some third-party tools generate code to facilitate rapid code development. El código generado por el compilador que aparece en los archivos de GeneratedCodeAttribute código fuente normalmente se marca con el atributo.Compiler-generated code that appears in source files is usually marked with the GeneratedCodeAttribute attribute.

Puede decidir si desea suprimir los errores y advertencias de análisis de código para el código generado.You can choose whether to suppress code analysis warnings and errors for generated code. Para obtener información sobre cómo suprimir estas advertencias y errores, consulte Cómo: Suprime las advertencias delcódigo generado.For information about how to suppress such warnings and errors, see How to: Suppress Warnings for Generated Code.

Note

El análisis de código GeneratedCodeAttribute se omite cuando se aplica a un ensamblado completo o a un solo parámetro.Code analysis ignores GeneratedCodeAttribute when it is applied to either an entire assembly or a single parameter.

Supresiones de nivel globalGlobal-level suppressions

La herramienta de análisis de código administrado SuppressMessage examina los atributos que se aplican en el nivel de ensamblado, módulo, tipo, miembro o parámetro.The managed code analysis tool examines SuppressMessage attributes that are applied at the assembly, module, type, member, or parameter level. También activa las infracciones en los recursos y espacios de nombres.It also fires violations against resources and namespaces. Estas infracciones deben aplicarse en el nivel global y tienen el ámbito y el destino.These violations must be applied at the global level and are scoped and targeted. Por ejemplo, el siguiente mensaje suprime una infracción del espacio de nombres:For example, the following message suppresses a namespace violation:

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

Note

Al suprimir una advertencia con namespace el ámbito, se suprime la advertencia en el espacio de nombres en sí.When you suppress a warning with namespace scope, it suppresses the warning against the namespace itself. No suprime la advertencia en los tipos del espacio de nombres.It does not suppress the warning against types within the namespace.

Cualquier supresión se puede expresar especificando un ámbito explícito.Any suppression can be expressed by specifying an explicit scope. Estas supresiones deben residir en el nivel global.These suppressions must live at the global level. No se puede especificar la supresión de nivel de miembro decorando un tipo.You cannot specify member-level suppression by decorating a type.

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.Global-level suppressions are the only way to suppress messages that refer to compiler-generated code that does not map to explicitly provided user source. Por ejemplo, el siguiente código suprime una infracción en un constructor emitido por compilador:For example, the following code suppresses a violation against a compiler-emitted constructor:

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

Note

Targetsiempre contiene el nombre completo del elemento.Target always contains the fully qualified item name.

Archivo de supresión globalGlobal suppression file

El archivo de supresión global mantiene las supresiones que son supresiones de nivel global o supresiones que no especifican un destino.The global suppression file maintains suppressions that are either global-level suppressions or suppressions that do not specify a target. Por ejemplo, las supresiones para las infracciones de nivel de ensamblado se almacenan en este archivo.For example, suppressions for assembly-level violations are stored in this file. 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 de un formulario.Additionally, some ASP.NET suppressions are stored in this file because project-level settings are not available for code behind a form. Se crea un archivo de supresión global y se agrega al proyecto la primera vez que se selecciona la opción en el archivo de supresión del proyecto del comando suprimir de la ventana de lista de errores .A global suppression file is created and added to your project the first time that you select the In Project Suppression File option of the Suppress command in the Error List window.

Vea tambiénSee also