Cenni preliminari sull'eliminazione nell'origine

Aggiornamento: novembre 2007

L'eliminazione nell'origine è la possibilità di eliminare o ignorare le violazioni rilevate dall'analisi del codice tramite l'utilizzo dell'attributo SuppressMessage. L'attributo SuppressMessageè un attributo condizionale incluso nei metadati IL dell'assembly del codice gestito solo se il simbolo di compilazione CODE_ANALYSIS è stato definito in fase di compilazione. In C++, le due macro CA_SUPPRESS_MESSAGE e CA_GLOBAL_SUPPRESS_MESSAGE svolgono la stessa funzione.

Si consiglia di utilizzare l'eliminazione in origine nelle compilazioni di debug o di archiviazione per eliminare la possibilità di fornire erroneamente i metadati dell'eliminazione in origine e di compromettere l'esecuzione o le prestazioni a causa di un aumento eccessivo dei metadati.

Nota:

Non è necessario creare manualmente questi attributi. Per ulteriori informazioni, vedere Procedura: non visualizzare avvisi tramite una voce di menu.

Attributo SuppressMessage

Facendo clic con il pulsante destro del mouse su un avviso dell'analisi del codice in Elenco errori e scegliendo Elimina messaggi, viene aggiunto un attributo SuppressMessage al codice o al file delle eliminazioni globali del progetto.

L'attributo SuppressMessage presenta il seguente formato:

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

Dove:

  • Rule Category: la categoria in cui viene definita la regola.

  • Rule Id: l'identificatore relativo alla regola. Il supporto include un nome breve e un nome lungo, rispettivamente CAXXXX e CAXXXX:FriendlyTypeName.

  • Justification: il testo utilizzato per documentare il motivo dell'eliminazione del messaggio.

  • Message Id: identificatore univoco di un problema per ciascun messaggio.

  • Scope: la destinazione in cui è stato eliminato l'avviso. Se la destinazione non è specificata, viene impostata sulla destinazione dell'attributo. Gli ambiti supportati includono quanto segue:

    • Module

    • Spazio dei nomi

    • Risorsa

    • Type

    • Membro

    • Parametro

  • Target: identificatore utilizzato per specificare la destinazione in cui è stato eliminato l'avviso. Deve contenere un nome completo dell'elemento.

Utilizzo di SuppressMessage

Gli avvisi dell'analisi del codice sono eliminati al livello a cui è applicata un'istanza dell'attributo SuppressMessage . Lo scopo di questa procedura è quello creare un'associazione stretta tra le informazioni di eliminazione e il codice in cui si verifica la violazione.

La forma generale di eliminazione include la categoria della regola e un identificatore contenente una rappresentazione facoltativa leggibile del nome della regola. Ad esempio,

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

se la riduzione dei metadati dell'eliminazione nell'origine è strettamente legata alle prestazioni, il nome stesso della regola può essere omesso. La categoria della regola e il relativo rule ID costituiscono insieme un identificatore della regola univoco e sufficiente. Ad esempio,

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

Questo formato non è consigliato a causa dei problemi di gestibilità.

Eliminazione di più violazioni all'interno del corpo di un metodo

Gli attributi possono essere applicati solo a un metodo e non incorporati all'interno del corpo del metodo. È tuttavia possibile specificare l'identificatore come ID messaggio per distinguere più occorrenze di una violazione all'interno di un metodo.

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;
        }
    }
}

Codice generato

Compilatori del codice gestito e alcuni strumenti di terze parti generano codice per facilitare lo sviluppo rapido del codice. Il codice generato dal compilatore visualizzato nei file sorgente è contrassegnato generalmente con l'attributo GenerateCodeAttribute.

È possibile scegliere se eliminare gli avvisi dell'analisi del codice e gli errori da codice generato. Per informazioni sull'eliminazione di tali avvisi ed errori, vedere Proprietà di analisi del codice per il codice gestito.

L'analisi del codice ignora GenerateCodeAttribute quando viene applicato a un intero assembly o a un solo parametro. Queste situazioni si verificano raramente.

Eliminazioni a livello globale

Lo strumento di analisi del codice gestito esamina gli attributi SuppressMessage applicati a livello di assembly, modulo, tipo, membro o parametro. Attiva inoltre le violazioni operate su risorse e spazi dei nomi. Tali violazioni devono essere applicate a livello globale e vengono definite e destinate a un ambito. Nel messaggio riportato di seguito, ad esempio, viene eliminata una violazione di uno spazio dei nomi.

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

Nota:

Quando si elimina un avviso il cui ambito è lo spazio dei nomi, viene eliminato l'avviso in base allo spazio dei nomi stesso. L'avviso non viene eliminato in base ai tipi contenuti nello spazio dei nomi.

Qualsiasi eliminazione può essere espressa specificando un ambito esplicito. Queste eliminazioni devono avvenire a livello globale. Non è possibile specificare l'eliminazione a livello di membro mediante decorazione di un tipo.

Le eliminazioni a livello globale sono l'unico modo per eliminare messaggi che fanno riferimento a codice generato dal compilatore che non è associato a un'origine utente fornita esplicitamente. Nel codice che segue, ad esempio, viene eliminata una violazione in base a un costruttore emesso dal compilatore:

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

Nota:

La destinazione contiene sempre il nome completo dell'elemento.

File di eliminazioni globali

Il file dell'eliminazione globale gestisce le eliminazioni a livello globale oppure le eliminazioni che non specificano una destinazione. Le violazioni a livello di assembly, ad esempio, vengono memorizzate in questo file. Alcune eliminazioni ASP.NET, inoltre, vengono memorizzate in questo file in quanto le impostazioni a livello di progetto non sono disponibili per un modulo code-behind.

Vedere anche

Riferimenti

System.Diagnostics.CodeAnalysis