Posso ignorare avvertimento CodeAnalysis: sostituire stringa == “” con string.IsNullOrEmpty?

StackOverflow https://stackoverflow.com/questions/1661024

  •  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);
    }
    // ...
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top