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?
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)
[Pure]
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[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
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?IsNullOrWhitespace()
cela correspondrait à une chaîne vide. Essentiellement,IsNullOrEmpty()
correspond à un sous-ensemble deIsNullOrWhitespace()
.Les différences de pratique:
la source
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 :)la source
Contains
. Si vous voulez vous assurer que le nom d'utilisateur ne peut pas être composé uniquement d' espaces -IsNullOrWhiteSpace
c'est ok.IsNullOrEmpty
garantit uniquement que le nom d'utilisateur a été saisi d'une manière ou d'une autre.Voici l'implémentation réelle des deux méthodes (décompilées à l'aide de dotPeek)
la source
IsNullOrWhiteSpace
c'est vraistring.Empty
aussi! C'est un bonus :)Il dit que tout
IsNullOrEmpty()
n'inclut pas l'espacement des blancs tout en leIsNullOrWhiteSpace()
fait!IsNullOrEmpty()
Si la chaîne est:-Null
-Empty
IsNullOrWhiteSpace()
Si la chaîne est:-Null
-Empty -Contains
White Spaces Only
la source
Vérifiez cela avec IsNullOrEmpty et IsNullOrwhiteSpace
Vous verrez que IsNullOrWhiteSpace est beaucoup plus lent: /
la source
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.
la source
Qu'en est-il pour un fourre-tout ...
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.
la source
Dans la norme .Net 2.0:
la source