Rimuovere le violazioni dell'analisi del codice

Spesso è utile indicare che un avviso non è applicabile. L'eliminazione delle violazioni di analisi del codice indica che i membri del team sono stati esaminati e l'avviso può essere eliminato. Le sezioni seguenti descrivono i diversi modi per eliminare le violazioni di analisi del codice usando l'IDE di Visual Studio.

Eliminare le violazioni usando il file EditorConfig

In un file EditorConfig impostare la gravità su none, dotnet_diagnostic.CA1822.severity = nonead esempio . Per aggiungere un file EditorConfig, vedere Aggiungere un file EditorConfig a un progetto.

Eliminare le violazioni nel codice sorgente

È possibile eliminare le violazioni nel codice usando una direttiva del preprocessore, la direttiva #pragma warning (C#) o Disable (Visual Basic) per eliminare l'avviso solo per una riga di codice specifica. In alternativa, è possibile usare l'attributo SuppressMessage.

  • Dall'editor di codice

    Posizionare il cursore nella riga di codice con la violazione e premere CTRL+PUNTO (.) per aprire il menu Azioni rapide. Selezionare Elimina CAXXXX e quindi scegliere Origine o Origine (attributo).

    Se si sceglie Origine, viene visualizzata un'anteprima della direttiva del preprocessore che verrà aggiunta al codice.

    Suppress diagnostic from quick actions menu

    Se si sceglie in Origine (attributo), viene visualizzata un'anteprima dell'attributo SuppressMessage che verrà aggiunto al codice.

    Suppress diagnostic from quick actions menu using attribute

  • Dall'elenco errori

    Selezionare le regole da eliminare, quindi fare clic con il pulsante destro del mouse e selezionare Elimina>nell'origine.

    • Se si elimina In Origine, viene visualizzata la finestra di dialogo Anteprima modifiche e viene visualizzata un'anteprima dell'avviso C# #pragma o della direttiva di avviso di Visual Basic #Disable aggiunta al codice sorgente.

      Preview of adding #pragma warning in code file

    Nella finestra di dialogo Anteprima modifiche selezionare Applica.

    Nota

    Se non viene visualizzata l'opzione di menu Elimina in Esplora soluzioni, è probabile che la violazione provena dalla compilazione e non dall'analisi in tempo reale. L'elenco errori visualizza la diagnostica o le violazioni delle regole, sia dall'analisi del codice in tempo reale che dalla compilazione. Poiché la diagnostica della compilazione può essere obsoleta, ad esempio, se è stato modificato il codice per correggere la violazione ma non è stato ricompilato, non è possibile eliminare questi dati di diagnostica dall'elenco errori. La diagnostica dall'analisi in tempo reale o IntelliSense è sempre aggiornata con le origini correnti e può essere eliminata dall'elenco errori. Per escludere la diagnostica di compilazione dalla selezione, impostare il filtro origine Elenco errori da Build + IntelliSense solo a IntelliSense. Selezionare quindi la diagnostica da eliminare e procedere come descritto in precedenza.

    Error List source filter in Visual Studio

Eliminare le violazioni usando un file di eliminazione globale

Il file di eliminazione globale usa l'attributo SuppressMessage.

  • Nell'elenco errori selezionare le regole da eliminare, quindi fare clic con il pulsante destro del mouse e scegliere Elimina>nel file di eliminazione. Viene visualizzata la finestra di dialogo Anteprima modifiche e viene visualizzata un'anteprima dell'attributo SuppressMessageAttribute aggiunto al file di eliminazione globale.

    Preview of adding SuppressMessage attribute to suppression file

  • Dall'editor di codice posizionare il cursore nella riga di codice con la violazione e premere Azioni rapide e refactoring (oppure premere CTRL+ punto (.)) per aprire il menu Azioni rapide. Selezionare Elimina CAXXXX e quindi scegliere In File di eliminazione. Verrà visualizzata un'anteprima del file di eliminazione globale che verrà creato o modificato.

  • Dal menu Analizza selezionare Analizza compilazione>e Elimina problemi attivi nella barra dei menu per eliminare tutte le violazioni correnti. L'eliminazione di tutte le violazioni correnti viene talvolta definita "baselining".

Eliminare le violazioni usando le impostazioni del progetto

Da Esplora soluzioni aprire le proprietà per il progetto (fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà (o premere ALT + INVIO) e usare la scheda Analisi codice per configurare le opzioni. Ad esempio, è possibile disabilitare l'analisi del codice in tempo reale o disabilitare gli analizzatori .NET.

Eliminare le violazioni usando un set di regole

Nell'editor del set di regole deselezionare la casella di controllo accanto al nome o impostare Azione su Nessuno.

Eliminazione all'interno dell'origine e attributo SuppressMessage

L'eliminazione nell'origine (ISS) usa l'attributo SuppressMessageAttribute per eliminare un avviso. L'attributo può essere posizionato vicino al segmento di codice che ha generato l'avviso. È possibile aggiungere l'attributo SuppressMessageAttribute al file di origine digitandolo oppure è possibile usare il menu di scelta rapida in un avviso nell'elenco errori per aggiungerlo automaticamente.

L'attributo SuppressMessageAttribute è un attributo condizionale, incluso nei metadati IL dell'assembly di codice gestito. Questo attributo è incluso solo se il simbolo di compilazione CODE_ANALYSIS è definito in fase di compilazione.

In C++/CLI usare le macro CA_SUPPRESS_MESSAGE o CA_GLOBAL_SUPPRESS_MESSAGE nel file di intestazione per aggiungere l'attributo.

Nota

Non è consigliabile usare le eliminazioni all'interno dell'origine nelle build di rilascio per impedire la distribuzione accidentale dei metadati di eliminazione nell'origine.

Nota

Se si esegue la migrazione di un progetto a Visual Studio 2019, si potrebbe improvvisamente riscontrare un numero elevato di avvisi di analisi del codice. Se non si è pronti per correggere gli avvisi, è possibile eliminarli selezionando Analizza compilazione>e Elimina problemi attivi.

SuppressMessage (attributo)

Quando si seleziona Elimina dal menu di scelta rapida o di un avviso di analisi del codice nell'elenco errori, viene aggiunto un SuppressMessageAttribute attributo nel codice o al file di eliminazione globale del progetto.

L'attributo SuppressMessageAttribute ha il formato seguente:

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

Le proprietà dell'attributo includono:

  • Category : categoria in cui viene definita la regola. Per altre informazioni sulle categorie di regole di analisi del codice, vedere Avvisi del codice gestito.

  • CheckId : identificatore della regola. Il supporto include sia un nome breve che un nome lungo per l'identificatore della regola. Il nome breve è CAXXXX; il nome lungo è CAXXXX:FriendlyTypeName.

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

  • MessageId : identificatore univoco di un problema per ogni messaggio.

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

    • module - Questo ambito elimina gli avvisi per un assembly. Si tratta di un'eliminazione globale che si applica all'intero progetto.

    • resource - (solo FxCop legacy) Questo ambito elimina gli avvisi nelle informazioni di diagnostica scritte nei file di risorse che fanno parte del modulo (assembly). Questo ambito non viene letto o rispettato nei compilatori C#/VB per la diagnostica dell'analizzatore Roslyn, che analizza solo i file di origine.

    • type - Questo ambito elimina gli avvisi rispetto a un tipo.

    • member - Questo ambito elimina gli avvisi per un membro.

    • namespace - Questo ambito elimina gli avvisi sullo spazio dei nomi stesso. Non elimina gli avvisi contro i tipi all'interno dello spazio dei nomi.

    • namespaceanddescendants - (Richiede la versione del compilatore 3.x o successiva e Visual Studio 2019) Questo ambito elimina gli avvisi in uno spazio dei nomi e tutti i relativi simboli discendenti. Il namespaceanddescendants valore viene ignorato dall'analisi legacy.

  • Target : identificatore utilizzato per specificare la destinazione in cui viene eliminato l'avviso. Deve contenere un nome completo del componente.

Quando vengono visualizzati avvisi in Visual Studio, è possibile visualizzare esempi di SuppressMessage aggiungendo un'eliminazione al file di eliminazione globale. L'attributo di eliminazione e le relative proprietà necessarie vengono visualizzati in una finestra di anteprima.

Utilizzo di SuppressMessage

Gli avvisi di analisi del codice vengono eliminati a livello a cui viene applicato l'attributo SuppressMessageAttribute . Ad esempio, l'attributo può essere applicato a livello di assembly, modulo, tipo, membro o parametro. Lo scopo dell'applicazione di questo attributo è accoppiare strettamente le informazioni di eliminazione al codice in cui si verifica la violazione.

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

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

Se esistono motivi di prestazioni rigorosi per ridurre al minimo i metadati di eliminazione nell'origine, è possibile omettere il nome della regola. La categoria di regole e il relativo ID regola formano un identificatore di regola sufficientemente univoco. Ad esempio:

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

Per motivi di manutenibilità, non è consigliabile omettere il nome della regola.

Eliminare le violazioni selettive all'interno di un corpo del metodo

Gli attributi di eliminazione possono essere applicati a un metodo, ma non possono essere incorporati all'interno di un corpo del metodo. Tutte le violazioni di una determinata regola vengono eliminate se si aggiunge l'attributo SuppressMessageAttribute al metodo .

In alcuni casi, è possibile eliminare una particolare istanza della violazione. Si consideri l'esempio in cui il codice futuro non è automaticamente esente dalla regola di analisi del codice. Alcune regole di analisi del codice consentono di eliminare una determinata istanza della violazione usando la MessageId proprietà dell'attributo SuppressMessageAttribute . In generale, le regole legacy per le violazioni in un particolare simbolo (una variabile o un parametro locale) rispettano la MessageId proprietà . CA1500:VariableNamesShouldNotMatchFieldNames è un esempio di tale regola. Tuttavia, le regole legacy per le violazioni nel codice eseguibile (non simbolo) non rispettano la MessageId proprietà . Inoltre, gli analizzatori della piattaforma del compilatore .NET ("Roslyn") non rispettano la MessageId proprietà .

Per eliminare una particolare violazione del simbolo di una regola, specificare il nome del simbolo per la MessageId proprietà dell'attributo SuppressMessageAttribute . L'esempio seguente mostra il codice con due violazioni di CA1500:VariableNamesShouldNotMatchFieldNames, una per la name variabile e una per la age variabile. Viene eliminata solo la violazione per il age simbolo.

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

Eliminazioni a livello globale

Lo strumento di analisi del codice gestito esamina SuppressMessage gli attributi applicati a livello di assembly, modulo, tipo, membro o parametro. Vengono inoltre attivate violazioni contro le risorse e gli spazi dei nomi. Queste violazioni devono essere applicate a livello globale e hanno come ambito e destinazione. Ad esempio, il messaggio seguente elimina una violazione dello spazio dei nomi:

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

Nota

Quando si elimina un avviso con namespace ambito, l'avviso viene eliminato rispetto allo spazio dei nomi stesso. Non elimina l'avviso per i tipi all'interno dello spazio dei nomi .

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

Le eliminazioni a livello globale sono l'unico modo per eliminare i messaggi che fanno riferimento al codice generato dal compilatore che non esegue il mapping all'origine utente fornita in modo esplicito. Ad esempio, il codice seguente elimina una violazione rispetto a un costruttore generato dal compilatore:

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

Nota

Target contiene sempre il nome completo dell'elemento.

File di eliminazione globale

Il file di eliminazione globale mantiene eliminazioni che sono eliminazioni a livello globale o eliminazioni che non specificano una destinazione. Ad esempio, le eliminazioni per le violazioni a livello di assembly vengono archiviate in questo file. Inoltre, alcune eliminazioni ASP.NET vengono archiviate in questo file perché le impostazioni a livello di progetto non sono disponibili per il code-behind di un modulo. Viene creato un file di eliminazione globale e aggiunto al progetto la prima volta che si seleziona l'opzione In Project Suppress File (File eliminazione progetto) del comando Suppress (Elimina ) nella finestra Elenco errori .

Ambito di eliminazione del modulo

È possibile eliminare le violazioni della qualità del codice per l'intero assembly usando l'ambito del modulo .

Ad esempio, l'attributo seguente nel file di progetto GlobalSuppressions elimina la violazione ConfigureAwait per un progetto 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")]

Codice generato

I compilatori di 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 di origine è contrassegnato con l'attributo GeneratedCodeAttribute .

Per l'analisi del codice sorgente, è possibile eliminare i messaggi nel codice generato in un .editorconfig file. Per altre informazioni, vedere Escludere il codice generato.

Per l'analisi del codice legacy, è possibile scegliere se eliminare gli avvisi e gli errori di analisi del codice per il codice generato. Per informazioni su come eliminare tali avvisi ed errori, vedere Procedura: Eliminare gli avvisi per il codice generato.

Nota

L'analisi GeneratedCodeAttribute del codice ignora quando viene applicata a un intero assembly o a un singolo parametro.