string.IsNullOrEmpty (chaîne) vs string.IsNullOrWhiteSpace (chaîne)

207

L'utilisation de string.IsNullOrEmpty(string)lors de la vérification d'une chaîne est-elle considérée comme une mauvaise pratique lorsqu'il existe string.IsNullOrWhiteSpace(string)dans .NET 4.0 et supérieur?

eomeroff
la source

Réponses:

328

La meilleure pratique consiste à sélectionner la plus appropriée.

.Net Framework 4.0 Beta 2 a une nouvelle méthode IsNullOrWhiteSpace () pour les chaînes qui généralise la méthode IsNullOrEmpty () pour inclure également d'autres espaces blancs en plus de la chaîne vide.

Le terme «espace blanc» comprend tous les caractères qui ne sont pas visibles à l'écran. Par exemple, l'espace, le saut de ligne, la tabulation et la chaîne vide sont des caractères d'espace blanc * .

Référence: ici

Pour les performances, IsNullOrWhiteSpace n'est pas idéal mais est bon. Les appels de méthode entraîneront une petite pénalité de performance. En outre, la méthode IsWhiteSpace elle-même possède certaines indirections qui peuvent être supprimées si vous n'utilisez pas de données Unicode. Comme toujours, l'optimisation prématurée peut être mauvaise, mais c'est aussi amusant.

Référence: ici

Vérifiez le code source (Reference 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;
}

Exemples

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
CharithJ
la source
Maintenant, je suis confus: "IsNullOrWhiteSpace est une méthode pratique qui est similaire au code suivant, sauf qu'elle offre des performances supérieures" à partir d'ici: msdn.microsoft.com/en-us/library/…
robasta
@rob Le code en question est return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, ce qui implique une nouvelle allocation de chaîne et deux contrôles séparés. Très probablement dans IsNullOrWhitespace, cela se fait via un seul passage sans aucune allocation en vérifiant que chaque caractère de la chaîne est l'espace blanc, d'où des performances supérieures. Qu'est-ce qui vous embrouille réellement?
Ivan Danilov
10
Merci! Je n'ai jamais su si IsNullOrWhitespace()cela correspondrait à une chaîne vide. Essentiellement, IsNullOrEmpty()correspond à un sous-ensemble de IsNullOrWhitespace().
gligoran
156

Les différences de pratique:

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
Mohammad Dayyan
la source
4
Cela devrait être la réponse acceptée à mon avis. Cela a plus de sens que la réponse acceptée en montrant des exemples réels plutôt qu'une redirection.
eaglei22
37

Ce sont des fonctions différentes. Vous devez décider de votre situation ce dont vous avez besoin.

Je ne considère pas leur utilisation comme une mauvaise pratique. La plupart du temps, IsNullOrEmpty()c'est suffisant. Mais vous avez le choix :)

Ivan Danilov
la source
2
Par exemple, un champ de nom d'utilisateur sur une page d'inscription utiliserait IsNullOrEmtpy pour valider afin qu'un utilisateur ne puisse pas avoir d'espace comme nom.
Chris
14
@Rfvgyhn: si vous voulez vérifier que le nom d' utilisateur ne dispose pas d' espaces partout - vous devriez utiliser Contains. Si vous voulez vous assurer que le nom d'utilisateur ne peut pas être composé uniquement d' espaces - IsNullOrWhiteSpacec'est ok. IsNullOrEmptygarantit uniquement que le nom d'utilisateur a été saisi d'une manière ou d'une autre.
Ivan Danilov
1
En effet. J'essayais juste de donner un exemple concret à ajouter à votre réponse. Dans le monde réel, une règle de validation de nom d'utilisateur contiendrait généralement un peu plus de logique que de simplement vérifier si elle est vide ou vide.
Chris
28

Voici l'implémentation réelle des deux méthodes (décompilées à l'aide de 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;
    }
dekdev
la source
4
Cela signifie donc que IsNullOrWhiteSpacec'est vrai string.Emptyaussi! C'est un bonus :)
Ε Г И І И О
4
oui, le plus sûr sera d'utiliser IsNullOrWhiteSpace (True pour String.empty, null et whitespace)
dekdev
7

Il dit que tout IsNullOrEmpty()n'inclut pas l'espacement des blancs tout en le IsNullOrWhiteSpace()fait!

IsNullOrEmpty()Si la chaîne est:
-Null
-Empty

IsNullOrWhiteSpace()Si la chaîne est:
-Null
-Empty -Contains
White Spaces Only

Hk Shambesh
la source
2
J'ai rétrogradé parce que pendant que vous expliquez ce que fait chaque fonction, vous ne répondez pas à la question réelle.
tuespetre
2
Vous devez modifier votre réponse pour inclure toute la liste des «espaces blancs», tels que définis par le cadre: Le terme «espace blanc» comprend tous les caractères qui ne sont pas visibles à l'écran. Par exemple, l'espace, le saut de ligne, la tabulation et la chaîne vide sont des caractères d'espace blanc.
georger
2

Vérifiez cela avec IsNullOrEmpty et 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();

Vous verrez que IsNullOrWhiteSpace est beaucoup plus lent: /

Kabindas
la source
1
Cela est évident car IsNullOrEmpty se produit en temps constant O (1) tandis que IsNullOrwhiteSpace nécessite éventuellement une itération complète de la chaîne ou du temps O (n). Votre exemple temporisé utilise alors presque O (n ^ 2) temps. Pour un temporisateur avec une chaîne de taille normale, la différence de performances va être négligeable. Si vous traitez de très grandes quantités de texte ou l'appelez dans une grande boucle, vous ne voudrez probablement pas l'utiliser.
Charles Owen,
1

string.IsNullOrEmpty (str) - si vous souhaitez vérifier que la valeur de la chaîne a été fournie

string.IsNullOrWhiteSpace (str) - fondamentalement, c'est déjà une sorte d'implémentation de la logique métier (c'est-à-dire pourquoi "" est mauvais, mais quelque chose comme "~~" est bon).

Mon conseil - ne mélangez pas la logique métier avec les contrôles techniques. Ainsi, par exemple, string.IsNullOrEmpty est le meilleur à utiliser au début des méthodes pour vérifier leurs paramètres d'entrée.

beloblotskiy
la source
0

Qu'en est-il pour un fourre-tout ...

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

Cela supprimera tous les espaces s'ils sont là en évitant la pénalité de performance de IsWhiteSpace, qui permettra à la chaîne de remplir la condition "vide" si elle n'est pas nulle.

Je pense également que c'est plus clair et que c'est généralement une bonne pratique de couper les chaînes de toute façon, surtout si vous les mettez dans une base de données ou quelque chose.

Remotec
la source
34
Cette vérification présente un grave inconvénient. L'appel de Trim () sur x entraînera une exception de référence nulle lorsqu'elle sera transmise comme nulle.
Ε Г И І И О
9
Bon point. Je vais laisser la réponse incorrecte pour montrer l'inconvénient.
Remotec
1
IsNullOrWhitespace PEUT optimiser pour vérifier la valeur nulle ou vide, en évitant de vérifier la chaîne pour les espaces blancs. Cette méthode effectuera toujours l'opération de rognage. En outre, bien qu'il puisse être optimisé, il créera probablement une autre chaîne en mémoire.
Sprague
if (string.IsNullOrEmpty (x? .Trim ()) devrait contourner le problème nul
Cameron Forward
0

Dans la norme .Net 2.0:

string.IsNullOrEmpty(): Indique si la chaîne spécifiée est nulle ou une chaîne vide.

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

string.IsNullOrWhiteSpace(): Indique si une chaîne spécifiée est nulle, vide ou se compose uniquement de caractères d'espacement.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Sina Lotfi
la source