Question

Après un incident au travail où je String.IsNullOrEmpty avec abusé variable de session, un collègue de travail collègue à moi refuse désormais mon utilisation de String.IsNullOrEmpty. Après quelques recherches, apparemment il y a un bug répertorié pour IsNullOrEmpty sur MSDN ( lien ) (lire la note en bas):

  

En date du 4 Avril 2006, il y a un bug   (Possible dans le JIT) qui fait cette   méthode échouent lorsque les optimisations sont   allumé. Il est connu pour affecter à la fois   C # et VB.

Plus d'informations peuvent être trouvées ici ( lien ) . Microsoft le bug est « soi-disant » post-Orcas fixe, mais malheureusement, mon employeur utilise encore VS2005. Mais si le problème est résolu en 2008+ soit. C'est très bien avec moi.

Alors que mon refus collègue de mon code avec IsNullOrEmpty pour moi est l'ignorance aveugle (OMI), il ne peut certainement pas me dire pourquoi pas pour l'utiliser autre que l'utilisation abusive de la variable de session. Je l'ai utilisé IsNullOrEmpty partout dans notre code sans problème que ce soit. Personnellement, je trouve qu'il est beaucoup plus facile à lire, en plus de faire deux choses dans une déclaration.

Après googler opinions sur le sujet, je l'ai trouvé des sites qui prennent les pros / con position. Voici quelques-uns des sites que j'ai lu ceci:

https://blog.rthand.com/post/2006 /06/22/1063.aspx

http://www.omegacoder.com/?p=105

Un site ( http://dotnetperls.com/isnullorempty ) résume la méthode (à mon humble avis) assez bien:

  

Ici, nous avons cherché que IsNullOrEmpty   Procédé selon le type de chaîne, qui   nous fournit une bonne et relativement   méthode efficace de vérifier si une   chaîne est OK pour enregistrer ou utiliser. cependant,   pour la performance, il peut être préférable de   utiliser les contrôles null manuel. Les chaînes vides   peuvent également être testés dans d'autres moyens, et   mes recherches ici montre que la vérification   longueur est le plus rapide.

En supposant que le correctif de bug est en place (et fonctionne correctement) dans VS2008 / 2010 / etc., Est-il une raison pas à utiliser String.IsNullOrEmpty avec VS2005 et au-delà? Je sais que cela peut sembler un peu exagéré sur une telle méthode peu stupide, mais je voudrais savoir s'il y a plus dans les coulisses en cours et si quelqu'un a d'autres explications.

Était-ce utile?

La solution

Ce problème a été résolu dans sp1 .NET 2.0. Il n'y a aucune raison d'éviter son utilisation maintenant.

Si vous utilisez .NET 2, vous devriez avoir sp1 pour beaucoup d'autres raisons de toute façon -. Je ne vois aucune raison d'éviter cela pour un bug qui n'existe plus

Autres conseils

Je l'ai entendu parler de ce bug avant, et de ce que je peux recueillir, il ne se produit jamais dans un code réel, uniquement dans le code comme dans l'exemple qui ne fait pas vraiment quoi que ce soit. Par ailleurs, le bug est pas avec la méthode IsNullOrEmpty lui-même, il se produirait peu importe la façon dont vous vérifier la chaîne.

Si la méthode est exactement ce que vous voulez faire, vous devez l'utiliser. Cependant, vous ne devriez pas l'utiliser dans toutes les situations pour vérifier une chaîne vide. Parfois, vous voulez seulement vérifier si la chaîne est vide et non si elle est nulle.

Si la variable de chaîne est nulle, ce sera juste sauter le bloc de code:

 if (!String.IsNullOrEmpty(str)) { ... }

Si la variable de chaîne est nulle, cela entraînera une exception:

 if (str.Length > 0) { ... }

Si la variable est pas censé être nulle, vous voulez probablement l'exception au lieu du code traitant la valeur NULL comme une chaîne vide. Si quelque chose ne va pas vous voulez attraper le plus tôt possible, car il sera plus difficile de suivre le problème à la source plus l'exception de la cause.

vous pouvez écrire un test unitaire qui passe une chaîne vide et qui passe une chaîne vide pour tester ce genre de choses, et l'exécuter dans VS2005 et après en 2008 et voir ce qui est arrivé

Dans ce rapport de bogue dans le lien que vous incluez dit:

  

Ce bogue a été corrigé dans le Microsoft .NET Framework 2.0 Service Pack 1 (SP1).

Puisque tel est le cas, il ne devrait pas d'importance si vous utilisez VS 2005 aussi longtemps que vous avez SP1 pour 2 .NET installé.

Quant à savoir si ou non de l'utiliser, consultez cette message par CodingHorror .

Nous utilisons une méthode d'extension pour string.IsNullOrEmpty:

public static bool IsNullOrEmpty(this string target)
{
  return string.IsNullOrEmpty(target);
}

En utilisant cette approche, même si elle était cassé dans une version précédente, un bugfix est une seule ligne de code.

Et l'utilité d'être en mesure d'utiliser la méthode sur une instance de chaîne qui pourrait être nulle:

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}

Je suis sûr qu'il a été fixé sur le SP1, mais de toute façon vous pouvez créer votre propre null ou méthode vide:)

Comme toute langue ou une partie de celui-ci, il est tout de connaître les avantages / inconvénients et prendre une décision fondée en se basant sur cette information. À mon humble avis.

Lorsque l'argument mise en œuvre de la vérification dans les API, je vérifie habituellement pour chaque condition séparément et jette différentes exceptions: ArgumentNullException pour une référence null ou, selon les spécifications de l'API, ArgumentException pour une chaîne vide. Dans ce cas, l'utilisation String.IsNullOrEmpty ne vous permet pas de faire la distinction entre ces deux conditions d'erreur séparés.

if (str == null)
{
    throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
    throw new ArgumentException("The string cannot be empty.", "str");
}

Si elle est cassée dans votre version, il est trivial d'avoir juste une méthode statique qui va faire la vérification, donc il suffit de faire:

public static bool isNull(String s) {
  return s == null || s.trim().length == 0;
}

Aucun point d'entrer dans un gros problème sur quelque chose qui devrait être relativement facile à corriger.

Vous n'avez pas besoin de changer partout, mais vous pouvez faire un remplacement global d'une méthode statique avec un autre.

Je me demande pourquoi les gens utilisent string.Empty, ce n'est pas une bonne chose, car il est une chaîne initialisées et ce concept existe seulement dans le cadre .Net partout c'est une chaîne valide avec len de 0 (serveurs db font destinction très claire entre cette et se plaindra si vous avez la logique de vérification de la valeur nULL, mais vous obtenez et chaîne vide). Je pense que String.IsNullOrEmpty est l'un des 5 pires pratiques / fonctions que j'ai jamais vu parce que d'une certaine manière, il encourage / fait regarder les gens ok init leurs chaînes et peut être considérée comme nulle. Cette fonction aurait jamais été ajouté et je pense que les gars .Net devraient essayer de l'éliminer progressivement :) Qui a besoin et chaîne vide de toute façon? Je ne l'ai jamais utilisé à moins que je devais en raison des projets existants utilisèrent

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top