Lequel est meilleur parmi ces trois? L'ancien est plus clair mais y a-t-il une différence de performance parmi celles-ci? Et si, dans le cas où une chaîne n'est jamais vide, comme si elle est prise à partir d'une zone de texte, qui pourrait être vide mais pas null? P> P>
7 Réponses :
aller avec Si vous n'avez besoin que de vérifier la chaîne "vide", j'irais avec un chèque contre string.isnullorempty (str) code>. Il est plus clair et plus succinct. Ce ne sera pas un cou de bouteille dans votre application. P>
string.empty code> car il exprime mieux votre intention. P>
Eh bien, la version de la question:
static bool HasValue(this string s) {
return !string.IsNullOrEmpty(s);
}
Ouais, beau conseil qui dure un. Je suis un peu de ventouse pour String.Format Méthodes d'extension :)
Super toujours, jamais pensé à ça.
@MARC Gravell: Je réalise que la méthode est statique, mais lorsque vous l'appelez sur une variable d'instance, tout le monde peut être capable de dire si un tel appel lancera une exception de référence nulle ou non.
@Esteban - le compilateur / runtime peut dire, cependant ;-p
Je suis d'accord avec Esteban, la syntaxe n'est pas claire à 100% aux non-initiés. Dans une tentative de rendre cela plus claire, au lieu de nommer la méthode d'extension «Hasvalue», je le nommerais plutôt exactement la même chose que la méthode statique: «isnullorempty», qui est autorisé: public statique bool isnullorempty (cette chaîne S) {Retour String .Isnullorempte (s); }
La méthode d'extension doit commencer par si (s == null) lancer une nouvelle nullreferenceException () code> (non argumentnullexception code>). Si cela ressemble à une méthode d'instance, elle se comporte comme une méthode d'instance. Si vous souhaitez que cela autorise un argument code> null code>, appelez-le statiquement.
@ Z280Z28: Non, ce n'est pas correct. Vous ne devriez jamais jeter une "NullReferenceException" dans votre propre code. Les méthodes d'extension sont des méthodes statiques et devraient donc lancer une "argumentnullexception" (si vous allez en lancer un - les exemples ici devraient retourner vrai ou faux et ne pas lancer). Pour plus de choses sur ce point de vue: Stackoverflow.com/ Questions / 463302 / ... .
Je me suis souvent demandé pourquoi cette méthode n'existe pas déjà pour chaîne code>. Si j'avais un dollar pour chaque fois que je devais écrire si (! String.isnullempty (suls)) code> Je serais un homme riche.
Les tests de performance sont ici: Jstawski.com/archive/2006/12/08/...
@Marcgravell Le nom de la méthode est incorrect - Hasvalue. La chaîne vide est également une valeur.
@anario qui dépend du contexte. Si je vous ai montré un certificat de naissance avec un nom de zéro caractères de longue durée et que vous vous avez demandé si cette personne avait un nom: Diriez-vous «oui»? Mais en effet, le nom pourrait être moins ambigu. Mais je vous laisserai dans un secret: Ce qui précède fonctionne bien pour nous i> (l'utilisation exacte est décrite dans les commentaires IntelliSense, etc.)
J'utiliserais le Isnullorempty. p>
Il sera plus facile d'analyser lorsque vous recherchez le code ultérieurement. P>
Voici un autre - légèrement bizarre - raison. Certains programmeurs ultérieurs sont tenus de venir plus tard, de gratter sa barbe et de dire «je pense que mystring.trim (). Longueur! = 0 est meilleur" et le changer. P>
Comme d'autres ont souligné: la vérification de NULL second est une erreur d'accès NULL potentielle en attente de se produire - la routine de la bibliothèque est garantie d'accord. P>
D'où la création de isnullorwhitepace code>: msdn.microsoft.com/en-us/library/...
Le à l'aide du string.isnullorempty code> est le meilleur choix si vous n'êtes pas sûr sur la manière de tester les différents états de la référence de la chaîne (ce que vous êtes évidemment, comme vous l'avez fausse de mal ...;). ISnullorempty code> Méthode: P> if (s.Length == 0) ...
Je crois que la chaîne.isnullorempty (String s) est mise en œuvre comme suit: P>
si (s == null || s.length == 0) ... p>
dans l'API. P>
... ce qui signifie aussi loin que le code IL va, le même IL est généré. Ni plus vite que l'autre.
Je ne suis pas sûr que cela opte pour le mettre ici, mais en utilisant le désassembleur, c'est ce qui est dans l'API pour chaîne.isnulloremptr (valeur) {if (valeur! = Null) {return.length == 0); } retourne vrai;}
C'est probablement un artefact de désassemblage plutôt que de la façon dont le code regarde réellement.
Comme d'autres personnes ont dit, Isnullorempty () est supérieure aux contrôles manuels aux fins de la maintenabilité et n'est pas susceptible de subir des performances grâce aux décisions d'exécution du compilateur de la JIT sur l'inlinisation (voir commentaires d'Eric Gunnerson ).
Si quelqu'un d'autre se demande quel est le produit .net La mise en œuvre semble, voici le .NET 4 Code: P>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}
Intéressant, ILSPY.EXE B> montre que MSCORLIB B> -> SYSTÈME B> -> String B> -> ISnullorempty (chaîne ): BOOL B> ressemble à ceci: Valeur de retour == NULL || Value.length == 0; code> b>.
Je crois que la chaîne.Innullorempty (String s) est mise en œuvre comme suit: Si (S == null || s.length == 0) ... dans l'API. code> p> blockQuote>C'est faux. Essayez-le et vous obtiendrez une exception car les deux instructions seront essayées. Si s est null, alors s.length lancera une précédente. P>
|| code> court-circuits, donc non, la seconde expression ne sera pas évaluée si s code> est null code>. Aussi, pas une réponse.