2011-11-21 5 views
5

Ho il seguente codice che fa non produce un avviso CA1804 (la variabile dichiarata non viene mai utilizzata) dall'analisi del codice (VS2010 Premium):L'analisi del codice non mostra l'avviso CA1804 nonostante la variabile di stringa locale non utilizzata in C# (VS2010 Premium)

... 
if(boolVariable) 
{ 
    string errorText = "Bla Bla Bla"; // Never used 
    ErrorProvider.SetError(SomeControl, "Some Warning"); 
} 
else 
{ 
    string errorText = "Acme Acme Acme"; // Used below 
    ErrorProvider.SetError(SomeControl, errorText); 
} 
... 

Quando rimuovo il ErrorProvider.SetError (...) linee, viene visualizzato l'avviso CA1804, ma perché non è questo il caso nel codice di esempio di cui sopra?

(Btw: il codice in sé non è troppo grande e solo scopo di illustrare la mia domanda.)

Tutte le idee che potrebbero causare questo comportamento? Immagino che questo potrebbe essere dovuto al fatto che il codice IL è ottimizzato in modo tale da mettere la dichiarazione al di fuori dello se, che a sua volta significherebbe che l'avviso non dovrebbe apparire in un esempio come quello sopra, ma Non sono sicuro se sia vero.

Grazie in anticipo

G.

+0

Probabilmente sposta 'error errorText = ...' al di fuori di 'if' e non riesce a notare la differenza tra le due variabili ugualmente nominate. Continua a fallire quando cambi il primo 'errorText' in' errorText2'? – Polynomial

risposta

3

Questo sarebbe a causa di un'ottimizzazione eseguita dal compilatore C#. Nella IL generata, la dichiarazione variabile viene issata dal blocco if:

string errorText; 
if (boolVariable) 
{ 
    errorText = "Bla Bla Bla"; 
    this.ErrorProvider.SetError(this.SomeControl, "Some Warning"); 
} 
else 
{ 
    errorText = "Acme Acme Acme"; 
    this.ErrorProvider.SetError(this.SomeControl, errorText); 
} 

Rimozione solo la seconda chiamata SetError è effettivamente sufficiente per innescare CA1804.

BTW, il compilatore C# dovrebbe aver emesso un avviso CS0219 per questo, apparentemente ignorato. Raccomanderei caldamente di considerare gli avvertimenti del compilatore come errori se si è interessati alla qualità del codice da remoto, cosa che si presume se si sta eseguendo l'analisi del codice. Perché aggiungere uno strumento di screening aggiuntivo prima di trarre il massimo vantaggio da quello che stai già utilizzando?

+0

Grazie, quindi la mia ipotesi era corretta. Per quanto riguarda i consigli CS0219 - Non riesco a trovare un avviso simile in VS2010 con CA1804 abilitato nell'analisi del codice (il livello di avviso è generalmente impostato su 4 nei nostri progetti). Entrambi avvertono sullo stesso problema ("... dichiara una variabile, '...', di tipo '...', che non è mai usato o è solo assegnato a ..." vs. "La variabile ' ... 'viene assegnato ma il suo valore non viene mai utilizzato. ") o mi manca qualcosa qui? – Gorgsenegger

+0

Non sono sicuro del motivo per cui non visualizzi l'avviso del compilatore. Questo particolare progetto in particolare non è impostato per gli avvisi di livello 4, anche se la maggior parte lo sono? O forse questo particolare avvertimento è disabilitato tramite la configurazione del progetto o un '#pragma disable disable'? Per quanto riguarda l'avviso CS0219 e CA1804 sullo stesso problema, il loro obiettivo è lo stesso, ma i dati con cui devono lavorare sono diversi (codice sorgente vs IL). Come hai già visto, ciò può portare a risultati diversi. –

+0

Nella mia domanda sopra il codice è stato ridotto un po 'a scopo illustrativo. Ho provato un po 'di più e ho scoperto che quando assegno una stringa fissa a "errorText" in entrambi i posti come in [string errorText = "Some fixed string";] Ottengo l'avviso del compilatore (CS0219). Non appena lo cambio a qualcosa di un po 'più complesso come in [stringa errorText = string.Format ("Alcune variabili: {0}", "abc");] l'avviso del compilatore scompare e viene emesso solo l'avviso di analisi del codice (se l'analisi del codice è effettivamente eseguita). Non capisco questo comportamento. – Gorgsenegger

Problemi correlati