5

Ho una classe come questa:analisi del codice VS2010. Sopprimere messaggio CA1051: DoNotDeclareVisibleInstanceFields per tutti i membri della classe

public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Quando eseguo VS2010 costruito in strumento di analisi del codice, ottengo avvertimenti identici: che 'campo' ... 'è visibile al di fuori del suo tipo di dichiarazione, modifica la sua accessibilità a privato e aggiunge una proprietà, con la stessa accessibilità che il campo ha attualmente, per fornire l'accesso ad esso'.

voglio sopprimere questo avvertimento per tutti i campi nella mia classe di Foo, ma io non voglio segnare ogni campo con SuppressMessage attributo in questo modo:

public class Foo 
{ 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int A = 1; 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int B = 2; 
} 

voglio marcare tutti i membri della classe , utilizzando un codice come questo:

[SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Ma questo codice non funziona, ricevo comunque un avviso di analisi del codice. Come posso farlo correttamente?

+0

I pensa di aver trovato un bug, di postare connect.microsoft.com –

+0

qualsiasi soluzione finale a riguardo? – Kiquenet

risposta

10

Non è possibile sopprimere più di 1 messaggio alla volta utilizzando SuppressMessageAttribute.

Come discussione può essere trovato here, ma la parte rilevante è:

si esegue in un equivoco comune circa SuppressMessage.

Ogni volta che si inserisce un SuppressMessage in un file di origine, si sopprime lo esattamente un problema (una "riga" nella griglia). Periodo.

Un messaggio SuppressMessage può essere posizionato "vicino" alla violazione o al livello di modulo . Livello del modulo, livello di assemblaggio e soppressione globale significano tutti la stessa cosa. Posizionando a livello di modulo, non è possibile eliminare più istanze del problema in una sola volta. È sufficiente arrivare a localizzare il SuppressMessage in una posizione diversa del codice. Il vantaggio principale di è che è possibile, ad esempio, raccogliere tutte le soppressioni correlate all'assieme in un singolo file (ad esempio, GlobalSuppressions.cs).

Quando si utilizza un SuppressMessage a livello di modulo, è necessario specificare l'obiettivo . La Target deve corrispondere esattamente a quanto riportato nella GUI per una violazione della regola.

Non c'è modo di utilizzare SuppressMessage per sopprimere una regola per l'intero scope di una classe o l'intero ambito di uno spazio dei nomi.

+0

Grazie mille! Sembra davvero che non capissi correttamente il concetto di SuppressMessage! Il tuo ansver mi ha aiutato molto. Ora ho avuto l'idea. – feorex

1

È possibile creare il file delle regole CodeAnalysis con una serie di regole come:

<?xml version="1.0" encoding="utf-8"?> 
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> 
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" 
     RuleNamespace="Microsoft.Rules.Managed"> 
    <Rule Id="CA1111" Action="Ignore" /> 
    </Rules> 
</RuleSet> 

vedere passo dopo passo procedura dettagliata:

+0

Grazie per la risposta, ma non voglio sopprimere questa regola per tutto il codice nella mia applicazione. C'è un modo per sopprimere questa regola solo per una classe? – feorex

+0

@feorex: IIRC è possibile definire l'attributo SupressMessage per qualsiasi metodo particolare – sll

Problemi correlati