Partager via


Vue d'ensemble de la suppression à la source

Mise à jour : novembre 2007

La suppression à la source est la capacité de supprimer ou d'ignorer des violations d'analyse du code en utilisant l'attribut SuppressMessage. L'attribut SuppressMessageest un attribut conditionnel qui est uniquement inclus dans les métadonnées IL de votre assembly de code managé si le symbole de compilation CODE_ANALYSIS est défini à la compilation. Dans C++, deux macros, CA_SUPPRESS_MESSAGE et CA_GLOBAL_SUPPRESS_MESSAGE, effectuent la même tâche.

Nous vous recommandons d'utiliser des suppressions à la source sur les générations d'archivage ou de débogage pour éviter d'expédier par erreur des métadonnées de suppression à la source et de compromettre l'exécution ou la performance en raison d'un excès de métadonnées.

Remarque :

Vous n'avez pas à coder vous-même à la main ces attributs. Pour plus d'informations, consultez Comment : supprimer des avertissements à l'aide d'un élément de menu.

Attribut SuppressMessage

Lorsque vous cliquez avec le bouton droit sur un avertissement d'analyse du code dans la Liste d'erreurs et que vous cliquez sur Supprimer les messages, un attribut SuppressMessage est ajouté à votre code ou au fichier des suppressions globales du projet.

L'attribut SuppressMessage a le format suivant :

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

Où :

  • Catégorie de règle - Catégorie dans laquelle la règle est définie.

  • ID de règle - Identificateur de la règle. La prise en charge comprend à la fois un nom court et un nom long pour l'ID de règle. Le nom court est CAXXXX et le nom long CAXXXX:FriendlyTypeName.

  • Justification - Texte utilisé pour documenter la raison de la suppression du message.

  • Identificateur de message - Identificateur unique d'un problème pour chaque message.

  • Portée - Cible sur laquelle l'avertissement est supprimé. Si la cible n'est pas spécifiée, elle a pour valeur la cible de l'attribut. Les portées prises en charge sont les suivantes :

    • Module

    • Espace de noms

    • Ressource

    • Type

    • Membre

    • Paramètres

  • Cible - Identificateur utilisé pour spécifier la cible sur laquelle l'avertissement est supprimé. Il doit contenir un nom d'élément complet.

Utilisation de SuppressMessage

Les avertissements d'analyse du code sont supprimés au niveau auquel une instance de l'attribut SuppressMessage est appliquée. Le but de ceci est d'associer étroitement les informations de suppression au code où la violation se produit.

Le type de suppression courant inclut la catégorie de règle et un identificateur de règle qui contient une représentation explicite facultative du nom de la règle. Par exemple :

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

S'il existe des motifs sérieux liés aux performances pour réduire les métadonnées de suppression à la source, le nom de la règle lui-même peut être ignoré. La catégorie de règle et son ID de règle constituent un identificateur de règle unique suffisant. Par exemple :

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

Ce format n'est pas recommandé à cause des problèmes de facilité de maintenance.

Suppression de plusieurs violations dans un corps de méthode

Les attributs ne peuvent être appliqués qu'à une méthode et ne peuvent pas être incorporés dans le corps de la méthode. Toutefois, vous pouvez spécifier l'identificateur comme ID de message pour distinguer plusieurs occurrences d'une violation dans une méthode.

Imports System

Namespace InSourceSuppression
    Public Class Class1
        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1801:ReviewUnusedParameters", MessageId:="guid")> _
        Shared Function IsValidGuid(ByVal guid As String) As Boolean
            Try
                Return True
            Catch e As ArgumentNullException
            Catch e As OverflowException
            Catch e As FormatException
            End Try

            Return False
        End Function
    End Class
End Namespace
using System;

namespace InSourceSuppression
{
    public class Class1
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
    "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
        public static bool IsValidGuid(string guid)
        {
            try
            {
              new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
              return true;
            }
            catch (ArgumentNullException) {}
            catch (OverflowException) {}
            catch (FormatException) {}
            return false;
        }
    }
}

Code généré

Les compilateurs de code managé et quelques outils tiers génèrent le code pour faciliter un développement rapide. Le code généré par le compilateur qui apparaît dans les fichiers sources est marqué habituellement avec l'attribut GenerateCodeAttribute.

Vous pouvez choisir s'il faut supprimer les avertissements d'analyse du code et les erreurs du code généré. Pour plus d'informations sur la suppression de tels avertissements et erreurs, consultez Propriétés d'analyse du code pour le code managé.

Notez que l'analyse du code ignore GenerateCodeAttribute lorsqu'il s'applique à un assembly entier ou un paramètre seul. Ces situations se produisent rarement.

Suppressions au niveau global

L'outil d'analyse du code managé examine les attributs SuppressMessage qui sont appliqués au niveau de l'assembly, du module, du type, du membre ou du paramètre. Il déclenche également des violations pour les ressources et les espaces de noms. Ces violations doivent être appliquées au niveau global du module ; elles ont une portée limitée et sont ciblées. Par exemple, le message suivant supprime une violation d'espace de noms :

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

Remarque :

Lorsque vous supprimez un avertissement avec une portée espace de noms, il supprime l'avertissement par rapport à l'espace de noms lui-même. Il ne supprime pas l'avertissement par rapport à des types dans l'espace de noms.

Toute suppression peut être exprimée en spécifiant une portée explicite. Ces suppressions doivent avoir lieu au niveau global. Vous ne pouvez pas spécifier une suppression au niveau membre en décorant un type.

Les suppressions au niveau global constituent le seul moyen de supprimer des messages qui font référence au code généré par le compilateur qui n'est pas mappé avec le code source utilisateur explicitement fourni. Par exemple, le code suivant supprime une violation concernant un constructeur émis par le compilateur :

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

Remarque :

La cible contient toujours le nom d'élément complet.

Fichier de suppression globale

Le fichier de suppression globale conserve les suppressions de niveau global ou qui ne spécifient pas de cible. Par exemple, les violations au niveau assembly sont enregistrées dans ce fichier. En outre, certaines suppressions ASP.NET sont stockées dans ce fichier parce que les paramètres de niveau de projet ne sont pas disponibles pour la forme code-behind.

Voir aussi

Référence

System.Diagnostics.CodeAnalysis