Posso ignorare avvertimento CodeAnalysis: sostituire stringa == “” con string.IsNullOrEmpty?
-
12-09-2019 - |
Domanda
Ho codice simile a questo:
string s = CreateString();
if (s == "") foo(s);
Se s è uguale a "", foo dovrebbe essere chiamato. Se stringa è nulla, che non dovrebbe mai accadere, allora un NullReferenceException va bene (come questo è, dopo tutto, una situazione eccezionale).
CodeAnalysis mi dice di provare per s.IsNullOrEmpty. Questo altererebbe la funzionalità in modo nunintended.
Le prestazioni non è un problema.
E 'sicuro per eliminare l'avviso CA1820 associato?
Modifica:. Aggiornato esempio di codice e il testo per riflettere meglio il mio caso
Modifica Questo è il (leggermente modificato) codice vero e proprio (è in un'implementazione IXmlSerializable standard):
public void ReadXml (XmlReader reader)
// ...
string img = reader.ReadElementString ("Image");
if (img != "") {
Image = Image.FromFile(img);
}
// ...
Soluzione
Sarà comportarsi in modo diverso per quanto riguarda i valori nulli, quindi dipende da cosa si desidera che accada; si menziona che NullReferenceException
sarebbe stato OK, ma non c'è nulla nel codice citato che avrebbe sollevare questo, quindi, perché potrebbe causare errori imprevisti a valle.
Non ho mai sono , ma io sono sempre tentato di aggiungere:
static bool IsNullOrEmpty(this string value) {
return string.IsNullOrEmpty(value);
}
in modo da poter usare:
if (s.IsNullOrEmpty()) foo();
Altri suggerimenti
Tutte le specifiche:
Se s è uguale a "", foo dovrebbe essere chiamato. Se stringa è nulla, che non dovrebbe mai accadere, poi un NullReferenceException va bene.
testare la stringa di lunghezza come avvertita in la regola CodeAnalysis :
if (s.Length == 0) foo(s);
La tua domanda:
E 'sicuro per sopprimere la associato warning CA1820?
È possibile ignorarlo, il codice funzionerà ma non lo consiglio è, seguire le linee guida il più possibile. Anche se l'argomento (performance) non è un problema, il codice sarà più consistente e ci si abitua a scrivere codice standard.
Ogni avvertimento analisi del codice ha associato la documentazione che è possibile accedere dal highligting l'avvertimento e premendo F1 . Si può anche fare clic destro sulla voce per ottenere aiuto.
In ogni caso, ecco la documentazione che spiega quel particolare allarme .
In base a tale documentazione, è "sicuro per sopprimere un avviso da questa regola se le prestazioni non è un problema".
Sarebbe meglio scrivere il test come:
if(s != null && s == "")
È quindi possibile elaborare un valore nullo in un altro if
Non sei davvero ignorare l'avvertimento, che hai guardato il codice e ha deciso che l'avvertimento non si applica. Questa è una condizione perfettamente ragionevole in base al quale per eliminare l'avviso.
pura speculazione
Vorrei sapere qualcosa di più su quello che stavi cercando di fare, comunque. Ho il sospetto che ci può essere un modo migliore per gestire la cosa. Il modello mi ricorda di restituire un messaggio di errore o vuoto per segnalare il successo di un metodo. Se questo è il caso, vorrei prendere in considerazione sia il ritorno vuoto e un'eccezione in caso di fallimento o di ritorno bool e solo generare eccezioni quando il messaggio è critico e restituendo vero / falso negli altri casi.
Se nulla è OK, andrà tutto bene in entrambi i casi.
Sì.
Ma sono d'accordo con CodeAnalysis con string.IsnullOrEmpty è una scelta sicura.
Non la gestione delle eccezioni, mentre è possibile è gennerally una cattiva idea in modo CA è proprio che si sia necessario trattare null come vuoto o gestire l'eccezione. Un'eccezione riferimento null causati dall'utilizzo di un valore di ritorno è una cosa molto brutta. Per lo meno mettere in un Debug.Assert (s! = Null) e confrontare string.Empty