127 votes

Par défaut d’initialisation de chaîne : NULL ou vide ?

J'ai toujours initialisé mes chaînes de caractères NULL, avec la pensée que la valeur NULL signifie l'absence de valeur, et "" ou de la Ficelle.Vide est une valeur valide. J'ai vu plus d'exemples dernièrement de code où la Chaîne.Vide est considéré comme la valeur par défaut ou ne représente aucune valeur. Cela me semble bizarre, avec les nouveaux types nullables en c# il semble que nous sommes à grands pas vers l'arrière avec des chaînes en n'utilisant pas la valeur NULL pour représenter le "Pas de Valeur".

Qu'utilisez-vous comme l'initialisation par défaut et pourquoi?

Edit: sur la Base des réponses j'ai plus mes réflexions

  1. Éviter les erreurs de manipulation Si la valeur ne doit pas être null, pourquoi ont-ils mis à l' NULL à la première place? Il serait peut-être mieux pour identifier l'erreur à l'endroit où il se produit plutôt que de le dissimuler à travers le reste de votre base de code?

  2. En évitant null vérifie Si vous êtes fatigué de faire des null vérifie dans le code, ne serait-il pas mieux résumé le nul de chèques? Peut-être wrap (ou prolonger!) la chaîne des méthodes pour faire leur NULL sûr? Qu'advient-il si vous êtes constamment utiliser String.Empty et une valeur null arrive à travailler son chemin dans votre système, vous commencez à ajouter de l' NULL des contrôles de toute façon?

Je ne peux pas aider, mais de retour à l'opinion que c'est la paresse. Toute DBA serait une gifle neuf façons de stupide si vous avez utilisé " au lieu de null dans son\sa base de données. Je pense que les mêmes principes s'appliquent à la programmation, et il devrait y avoir quelqu'un pour frapper ceux au dessus de la tête qui utilisent String.Empty plutôt que d' NULL pour représenter aucune valeur.

Questions Connexes

110voto

Adam Liss Points 27815

+1 pour faire la distinction entre « vide » et NULL. Je suis d’accord que « vide » devrait signifier « valide, mais vide » et « NULL » devrait signifier « non valide ».

Je répondrais donc votre question comme ceci :

vide quand je veux une valeur par défaut valide qui peut ou ne peut pas être modifiée, par exemple, prénom de l’utilisateur.

NULL lorsque c’est une erreur si le code qui s’ensuivit ne définit pas la valeur explicitement.

31voto

Tomalak Points 150423

Selon MSDN:

En initialisant les cordes avec le valeur au lieu de , vous pouvez réduire les chances d’une `` qui se produisent.

Toujours à l’aide `` est néanmoins une bonne pratique.

8voto

Robert Rossney Points 43767

Pour la plupart des logiciel qui n'est pas réellement de la chaîne de traitement de logiciel, la logique du programme ne doivent pas dépendre du contenu des variables de chaîne. Chaque fois que je vois quelque chose comme cela dans un programme:

if (s == "value")

Je reçois un mauvais sentiment. Pourquoi est-il une chaîne de caractères littérale dans cette méthode? Ce paramètre s? Sait-il que la logique dépend de la valeur de la chaîne? Sait-elle qu'elle doit être en minuscules pour travailler? Devrais-je être à la fixation de ce en le modifiant pour utiliser String.Compare? Dois-je créer un Enum et l'analyse en elle?

De ce point de vue, on arrive à une philosophie de code c'est assez simple: vous devez éviter de l'examen d'une chaîne de caractères contenu dans la mesure du possible. La comparaison d'une chaîne à l' String.Empty est juste un cas particulier de la comparaison à un littéral: c'est quelque chose à éviter de faire, sauf si vous devez vraiment.

Sachant cela, je ne clignote pas quand je vois quelque chose comme cela dans notre base de code:

string msg = Validate(item);
if (msg != null)
{
   DisplayErrorMessage(msg);
   return;
}

Je sais qu' Validate ne serait jamais retourné String.Empty, parce que nous à mieux écrire le code que ça.

Bien sûr, le reste du monde ne fonctionne pas comme cela. Lorsque votre programme est de traiter avec la saisie de l'utilisateur, fichiers, bases de données, et ainsi de suite, vous devez tenir compte d'autres philosophies. Là, c'est le travail de votre code d'imposer l'ordre sur le chaos. Une partie de cette commande est de savoir quand une chaîne vide devrait signifier String.Empty et quand cela signifierait - null.

(Juste pour vérifier que je n'étais pas de parler de mon cul, j'ai juste cherché notre base de code pour la Chaîne.IsNullOrEmpty'. Tous les 54 occurences sont les méthodes que les processus de saisie de l'utilisateur, les valeurs de retour de scripts Python, examiner les valeurs récupérées dans les Api externe, etc.)

5voto

Herms Points 13069

Ça dépend.

Avez-vous besoin d’être en mesure de dire si la valeur est manquante (est-ce possible de n’être ne pas définie) ?

Est une chaîne vide, une valeur valide pour l’utilisation de cette chaîne ?

Si vous avez répondu « oui » à la fois, alors vous voudrez utiliser null. Dans le cas contraire, vous ne peut pas faire la différence entre « aucune valeur » et « chaîne vide ».

Si vous n’avez pas besoin de savoir si il n’y a pas de valeur une chaîne vide est probablement plus sûre, car elle permet d’ignorer les vérifications nulle chaque fois que vous l’utilisez.

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