string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (string)


207

L'uso di string.IsNullOrEmpty(string)quando si controlla una stringa è considerato una cattiva pratica string.IsNullOrWhiteSpace(string)in .NET 4.0 e versioni successive?

Risposte:


328

La migliore pratica è selezionare quella più appropriata.

.Net Framework 4.0 Beta 2 ha un nuovo metodo IsNullOrWhiteSpace () per le stringhe che generalizza il metodo IsNullOrEmpty () per includere anche altri spazi bianchi oltre alla stringa vuota.

Il termine "spazio bianco" include tutti i caratteri che non sono visibili sullo schermo. Ad esempio, spazio, interruzione di riga, tabulazione e stringa vuota sono caratteri di spazi bianchi * .

Riferimento: qui

Per prestazioni, IsNullOrWhiteSpace non è l'ideale ma è buono. Le chiamate al metodo comporteranno una piccola penalità per le prestazioni. Inoltre, il metodo IsWhiteSpace stesso ha alcune indicazioni indirette che possono essere rimosse se non si utilizzano i dati Unicode. Come sempre, l'ottimizzazione prematura può essere malvagia, ma è anche divertente.

Riferimento: qui

Controlla il codice sorgente (Riferimento Source .NET Framework 4.6.2)

IsNullOrEmpty

[Pure]
public static bool IsNullOrEmpty(String value) {
    return (value == null || value.Length == 0);
}

IsNullOrWhiteSpace

[Pure]
public static bool IsNullOrWhiteSpace(String value) {
    if (value == null) return true;

    for(int i = 0; i < value.Length; i++) {
        if(!Char.IsWhiteSpace(value[i])) return false;
    }

    return true;
}

Esempi

string nullString = null;
string emptyString = "";
string whitespaceString = "    ";
string nonEmptyString = "abc123";

bool result;

result = String.IsNullOrEmpty(nullString);            // true
result = String.IsNullOrEmpty(emptyString);           // true
result = String.IsNullOrEmpty(whitespaceString);      // false
result = String.IsNullOrEmpty(nonEmptyString);        // false

result = String.IsNullOrWhiteSpace(nullString);       // true
result = String.IsNullOrWhiteSpace(emptyString);      // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString);   // false

Ora sto confuso: "IsNullOrWhiteSpace è un metodo comodo che è simile al seguente codice, tranne che offre prestazioni superiori" da qui: msdn.microsoft.com/en-us/library/...
robasta

@rob Il codice in questione è return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, che comporta una nuova allocazione di stringhe e due controlli separati. Molto probabilmente all'interno di IsNullOrWhitespace viene eseguito tramite un singolo passaggio senza allocazioni verificando che ogni carattere nella stringa sia lo spazio bianco, quindi prestazioni superiori. Cosa ti confonde in realtà?
Ivan Danilov,

10
Grazie! Non ho mai saputo se IsNullOrWhitespace()corrispondesse a una stringa vuota. In sostanza IsNullOrEmpty()corrisponde a un sottoinsieme di IsNullOrWhitespace().
Gligoran,

156

Le differenze nella pratica:

string testString = "";
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString)));
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString)));
Console.ReadKey();

Result :
IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = " MDS   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : False

**************************************************************
string testString = "   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : True

**************************************************************
string testString = string.Empty;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = null;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True

4
Questa dovrebbe essere la risposta accettata secondo me. Ha più senso della risposta accettata mostrando esempi reali piuttosto che un reindirizzamento.
eaglei22,

37

Sono funzioni diverse. Dovresti decidere per la tua situazione di cosa hai bisogno.

Non considero l'utilizzo di nessuno di questi come una cattiva pratica. Il più delle volte IsNullOrEmpty()è abbastanza. Ma hai la scelta :)


2
Ad esempio, un campo del nome utente in una pagina di registrazione userebbe IsNullOrEmtpy per convalidare in modo che un utente non possa avere uno spazio come nome.
Chris,

14
@Rfvgyhn: se vuoi controllare che lo username non abbia spazi da nessuna parte , dovresti usarlo Contains. Se vuoi assicurarti che il nome utente non possa consistere solo di spazi , IsNullOrWhiteSpaceva bene. IsNullOrEmptyassicura che solo il nome utente sia stato inserito in qualche modo.
Ivan Danilov,

1
Infatti. Stavo solo cercando di dare un esempio concreto da aggiungere alla tua risposta. Nel mondo reale, una regola di convalida del nome utente di solito conterrebbe un po 'più di logica rispetto al semplice controllo del suo spazio vuoto o bianco.
Chris,

28

Ecco l'implementazione effettiva di entrambi i metodi (decompilati usando dotPeek)

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public static bool IsNullOrEmpty(string value)
    {
      if (value != null)
        return value.Length == 0;
      else
        return true;
    }

    /// <summary>
    /// Indicates whether a specified string is null, empty, or consists only of white-space characters.
    /// </summary>
    /// 
    /// <returns>
    /// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters.
    /// </returns>
    /// <param name="value">The string to test.</param>
    public static bool IsNullOrWhiteSpace(string value)
    {
      if (value == null)
        return true;
      for (int index = 0; index < value.Length; ++index)
      {
        if (!char.IsWhiteSpace(value[index]))
          return false;
      }
      return true;
    }

4
Quindi questo significa che IsNullOrWhiteSpacevale anche per string.Empty! È un bonus :)
Ε Г И І О

4
sì, sarà più sicuro usare IsNullOrWhiteSpace (True per String.empty, null e whitespace)
dekdev

7

Dice che tutto IsNullOrEmpty()non include la spaziatura bianca mentre lo IsNullOrWhiteSpace()fa!

IsNullOrEmpty()Se stringa è:
-null
-Vuoto

IsNullOrWhiteSpace()Se stringa è:
-null
-Vuoto
gli ambienti, -Contiene solo Bianco


2
Ho annullato il voto perché mentre spieghi cosa fa ogni funzione, non rispondi alla domanda reale.
tuespetre,

2
È necessario modificare la risposta per includere l'intero elenco per "spazio bianco", come definito dal framework: il termine "spazio bianco" include tutti i caratteri che non sono visibili sullo schermo. Ad esempio, spazio, interruzione di riga, tabulazione e stringa vuota sono caratteri di spazi bianchi.
Georg

2

Dai un'occhiata a IsNullOrEmpty e IsNullOrwhiteSpace

string sTestes = "I like sweat peaches";
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < 5000000; i++)
    {
        for (int z = 0; z < 500; z++)
        {
            var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace
        }
    }

    stopWatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;
    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
    Console.WriteLine("RunTime " + elapsedTime);
    Console.ReadLine();

Vedrai che IsNullOrWhiteSpace è molto più lento: /


1
Ciò è ovvio perché IsNullOrEmpty si verifica a tempo costante O (1) mentre IsNullOrwhiteSpace richiede probabilmente un'iterazione completa della stringa o del tempo O (n). Quindi il tuo esempio cronometrato in realtà sta usando quasi O (n ^ 2) tempo. Per un timer con una stringa di dimensioni normali, la differenza di prestazioni sarà trascurabile. Se stavi elaborando grandi quantità di testo o chiamandolo in un ciclo grande, probabilmente non vorrai usarlo.
Charles Owen,

1

string.IsNullOrEmpty (str) - se si desidera verificare che sia stato fornito il valore della stringa

string.IsNullOrWhiteSpace (str) - fondamentalmente questa è già una sorta di implementazione della logica di business (cioè perché "" è male, ma qualcosa come "~~" è buono).

Il mio consiglio: non mescolare la logica aziendale con i controlli tecnici. Quindi, ad esempio, string.IsNullOrEmpty è il migliore da utilizzare all'inizio dei metodi per controllare i loro parametri di input.


0

Che dire di questo per una cattura tutto ...

if (string.IsNullOrEmpty(x.Trim())
{
}

Ciò eliminerà tutti gli spazi se presenti evitando la penalità di prestazione di IsWhiteSpace, che consentirà alla stringa di soddisfare la condizione "vuota" se non è nulla.

Penso anche che sia più chiaro e che sia generalmente buona norma tagliare le stringhe, specialmente se le si inserisce in un database o qualcosa del genere.


34
Questo controllo ha un grave svantaggio. Chiamare Trim () su x si tradurrà in un'eccezione di riferimento null quando viene passato come null.
Ε Г И І И О

9
Buon punto. Lasciare la risposta errata per mostrare l'inconveniente.
Remotec

1
IsNullOrWhitespace PUO 'ottimizzare per verificare la presenza di valori nulli o vuoti, evitando di controllare la stringa per spazi bianchi. Questo metodo eseguirà sempre l'operazione di taglio. Inoltre, sebbene possa essere ottimizzato, probabilmente creerà un'altra stringa in memoria.
Sprague,

if (string.IsNullOrEmpty (x? .Trim ()) dovrebbe aggirare il problema nullo
Cameron Forward,

0

Nello standard .Net 2.0:

string.IsNullOrEmpty(): Indica se la stringa specificata è nulla o vuota.

Console.WriteLine(string.IsNullOrEmpty(null));           // True
Console.WriteLine(string.IsNullOrEmpty(""));             // True
Console.WriteLine(string.IsNullOrEmpty(" "));            // False
Console.WriteLine(string.IsNullOrEmpty("  "));           // False

string.IsNullOrWhiteSpace(): Indica se una stringa specificata è null, vuota o è composta solo da spazi bianchi.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.