8
votes

String.isnullorempty (mystring) vs mystring! = Null

Lequel est meilleur parmi ces trois? XXX

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?


0 commentaires

7 Réponses :


4
votes

aller avec string.isnullorempty (str) . Il est plus clair et plus succinct. Ce ne sera pas un cou de bouteille dans votre application.

Si vous n'avez besoin que de vérifier la chaîne "vide", j'irais avec un chèque contre string.empty car il exprime mieux votre intention.


0 commentaires

18
votes

Eh bien, la version de la question:

static bool HasValue(this string s) {
    return !string.IsNullOrEmpty(s);
}


11 commentaires

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 () (non argumentnullexception ). 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 null , 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 . Si j'avais un dollar pour chaque fois que je devais écrire si (! String.isnullempty (suls)) 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 (l'utilisation exacte est décrite dans les commentaires IntelliSense, etc.)



2
votes

J'utiliserais le Isnullorempty.

Il sera plus facile d'analyser lorsque vous recherchez le code ultérieurement.

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.

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.


1 commentaires

D'où la création de isnullorwhitepace : msdn.microsoft.com/en-us/library/...



1
votes

Le 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 ...;).

à l'aide du ISnullorempty code> Méthode: P>

if (s.Length == 0) ...


0 commentaires

0
votes

Je crois que la chaîne.isnullorempty (String s) est mise en œuvre comme suit:

si (s == null || s.length == 0) ...

dans l'API.


3 commentaires

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



2
votes

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;
}


1 commentaires

Intéressant, ILSPY.EXE montre que MSCORLIB -> SYSTÈME -> String -> ISnullorempty (chaîne ): BOOL ressemble à ceci: Valeur de retour == NULL || Value.length == 0; .



-3
votes

Je crois que la chaîne.Innullorempty (String s) est mise en œuvre comme suit: Si (S == null || s.length == 0) ... dans l'API.

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.


1 commentaires

|| court-circuits, donc non, la seconde expression ne sera pas évaluée si s est null . Aussi, pas une réponse.