221 votes

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

L'utilisation de string.IsNullOrEmpty(string) lors de la vérification d'une chaîne de caractères considérée comme une mauvaise pratique lorsqu'il y a string.IsNullOrWhiteSpace(string) dans .NET 4.0 et plus ?

345voto

CharithJ Points 15364

La meilleure pratique consiste à choisir la plus appropriée.

Le .Net Framework 4.0 Beta 2 comporte une nouvelle méthode IsNullOrWhiteSpace() pour les chaînes de caractères. chaînes de caractères, qui généralise la méthode IsNullOrEmpty() afin d'inclure d'autres espaces blancs en plus des espace blanc en plus de la chaîne vide.

Le terme "espace blanc" comprend tous les caractères qui ne sont pas visibles à l'écran. l'écran. Par exemple, l'espace, le saut de ligne, la tabulation et la chaîne vide sont des caractères d'espace blanc*. 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 légère pénalité de performance. De plus, la méthode IsWhiteSpace elle-même comporte des indirections qui peuvent être supprimées si vous n'utilisez pas de données Unicode. Comme toujours, l'optimisation prématurée prématurée peut être maléfique, mais elle est aussi amusante.

Référence : Ici

Vérifier le code source (Source de référence .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

0 votes

Maintenant, je suis confus : "IsNullOrWhiteSpace est une méthode de commodité qui est similaire au code suivant, sauf qu'elle offre des performances supérieures" d'ici : msdn.microsoft.com/fr/us/library/

0 votes

@rob Le code en question est return String.IsNullOrEmpty(value) || value.Trim().Length == 0; ce qui implique une nouvelle allocation de chaînes de caractères et deux contrôles distincts. Très probablement, dans IsNullOrWhitespace, cela se fait en une seule passe sans aucune allocation en vérifiant que chaque caractère de la chaîne est un espace blanc, d'où des performances supérieures. Qu'est-ce qui vous perturbe en fait ?

14 votes

Merci ! Je n'ai jamais su si IsNullOrWhitespace() correspondrait à une chaîne vide. En substance IsNullOrEmpty() correspond à un sous-ensemble de IsNullOrWhitespace() .

164voto

Mohammad Points 2448

Les différences dans la 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

4 votes

Cela devrait être la réponse acceptée, à mon avis. Elle est plus logique que la réponse acceptée en montrant des exemples réels plutôt qu'une redirection.

37voto

Ivan Danilov Points 5719

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

Je ne considère pas l'utilisation de l'un d'entre eux comme une mauvaise pratique. La plupart du temps IsNullOrEmpty() est suffisant. Mais vous avez le choix :)

2 votes

Par exemple, un champ de nom d'utilisateur sur une page d'inscription utiliserait IsNullOrEmtpy pour valider qu'un utilisateur ne puisse pas avoir un espace comme nom.

14 votes

@Rfvgyhn : si vous voulez vérifier que le nom d'utilisateur ne contient pas d'espaces. partout - vous devez utiliser Contains . Si vous voulez vous assurer que le nom d'utilisateur ne peut pas être composé d'espaces seulement - IsNullOrWhiteSpace c'est bon. IsNullOrEmpty assure que seul ce nom d'utilisateur a été saisi d'une manière ou d'une autre.

1 votes

En effet. J'essayais juste de donner un exemple concret pour compléter votre réponse. Dans le monde réel, une règle de validation du nom d'utilisateur contient généralement un peu plus de logique que le simple fait de vérifier s'il est vide ou s'il comporte des espaces.

28voto

dekdev Points 1323

Voici l'implémentation réelle des deux méthodes ( décompilée avec 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 votes

Cela signifie donc IsNullOrWhiteSpace est vrai pour string.Empty également ! C'est un bonus :)

4 votes

Oui, le plus sûr est d'utiliser IsNullOrWhiteSpace ( True pour String.empty, null et whitespace ).

7voto

Hk Shambesh Points 11

Tout est dit IsNullOrEmpty() ne comprend pas d'espacement blanc alors que IsNullOrWhiteSpace() fait !

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

IsNullOrWhiteSpace() Si la chaîne est :
-Null
-Empty
-Contenant uniquement des espaces blancs

2 votes

J'ai rétrogradé car bien que vous expliquiez ce que fait chaque fonction, vous ne répondez pas à la question réelle.

2 votes

Vous devriez 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X