chaîne de caractères.Vide vs null.Lequel utilisez-vous?
Récemment, un collègue de travail m'a dit de ne pas utiliser string.Empty
lorsque le paramètre est une variable de type string, mais l'utilisation null
comme il pollue la pile?
Il dit de ne pas faire
string myString=string.Empty;
mais ne string mystring=null;
Est-il vraiment important? Je sais string est un objet de sorte qu'il sorte de sens.
Je sais, c'est une question stupide, mais qu'est-ce que votre point de vue?
- Je ne suis pas entièrement sûr de savoir pourquoi vous souhaitez faire non plus... pouvez-vous donner un peu plus de code que vous étaient en train de discuter comme un exemple?
- il n'y a pas de code.J'ai demandé à mon collègue de regarder quelque chose que j'ai été le débogage et il a dit que, en règle générale "ne pas utiliser de chaîne.vide" set null comme il va sur la pile.Personnellement j'ai toujours utilisé de la chaîne.Vide comme l'époque de sa sortie devait être la bonne chose à utiliser plutôt que de "".
- Voir aussi: En C#, dois-je utiliser des chaînes de caractères.Vide ou Chaîne.Vide ou "" ?
- Ce que je veux dire, c'est...
string.Empty
,""
, etnull
sont toutes des valeurs constantes, mais ils sont tous "simple" que je ne vois pas pourquoi vous vous souhaitez affecter à une variable. Si vous avez besoin de capturer uneout
variable, pourquoi ne pas simplement utiliserstring myString;
? - Ces jours-ci, les arguments sur des sujets tels que ce qui ne sont pas axés sur la lisibilité et de la sémantique et de se concentrer sur l'absurde micro-optimisations sont, au mieux, faible. Utilisation selon l'une signifie la bonne chose pour votre contexte donné. (par exemple, Si vous connaissez quelqu'un n'a pas un prénom, vous utilisez
String.Empty
; si vous ne savez pas si oui ou non quelqu'un a un moyen nom que vous utiliseznull
). Ensuite, une fois que vous avez le bon sens, d'écrire le code d'une manière qui est clairement correct et facile d'entretien.
Vous devez vous connecter pour publier un commentaire.
null
etEmpty
sont très différents, et je ne le conseille pas arbitrairement de commutation entre eux. Mais elle n'a aucun supplément de "coût", depuisEmpty
est un seul point de référence fixe (vous pouvez utiliser n'importe quel nombre de fois).Il n'y a pas de "pollution" sur la pile causée par un ldsfld - cette préoccupation est.... fou. Chargement d'un
null
est sans doute légèrement moins cher, mais elle peut causer null-les exceptions de référence si vous n'êtes pas prudent sur la vérification de la valeur.Personnellement, je l'utilise ni... Si je veux une chaîne vide-je utiliser
""
- simple et évident. Stage signifie cette aussi n'a pas per-utilisation de surcharge.Au niveau IL, la différence ici entre les "" et de Vide est juste ldstr vs ldsfld - mais les deux donnent la même interné chaîne de référence. En outre, ces dernières .NET versions le JIT a interception directe de ces, rendement de la chaîne de caractères vide de référence sans en train de faire un champ statique de recherche. Fondamentalement, il y a exactement aucune raison de soins de toute façon, à l'exception de la lisibilité. Je viens de l'utiliser "".
if (str != null && !str.equals("")
""
au lieu de six fois plus de code réutilisable. Celui qui a défendu ce non-sens?! @Jalal Que Brad Abrams affichage est sérieusement dépassé et si le compilateur toujours n'est pas parti de ces deux codes à faire de même, alors honte à Microsoft! Mais ce n'est pas notre travail pour résoudre leur travail. Et en fait, nous n'avons pas besoin d': Dans le deuxième lien, Lasse (dans les commentaires) a comparé l'assemblée sorties de la comparaison avec les deux variantes: elles sont identiques.""
il recherche sur l'ensemble du bassin pour vérifier si il est déjà là ou pas, et qui est la façon lors de l'utilisation de lastring.Empty;
il utilisera que prédéfinis de la valeur et de la recherche n'existe plus. en outre, la classe exposeed cette méthodes:string.Intern/IsInterned
case ceci""
. En outre, la vérification de la chaîne de formation de la piscine est un très bon marché, d'utilisation, pas de recherche “[ing] de l'ensemble du bassin” qui se passe.""
où j'ai une variable statique de là-bas. Imaginez que vous avez un champ statique de l'Image de la classe appeléImage.Empty
alors je vais certainement pas utilisernew Image(1, 1)
par exemple.. c'est pas non plus sur le nombre de caractères le code est..new String(new char[]{})
donc votre comparaison ne fonctionne pas vraiment. En outre: “il n'est pas sur le nombre de caractères dont le code est” – non: dans un sens, c' est. Code inutile conduit à l'encombrement visuel, la réduction de la lisibilité.""
dans une assemblée - c'est une chaîne unique instance. Toute comparaisonnew Image(...)
est dénuée de sensImage.Empty
exemple ici juste pour démontrer la réutilisabilité du code. quand j'ai un champ statique qui déclarait déjà là, je vais l'utiliser.StringUtils.isNullOrEmpty(String)
(en Java) 🙂Il ne pas "polluer la pile", il n'y a pas de raison technique, mais il y a une grande différence entre la définition d'une variable à une référence à un objet (même si c'est une chaîne vide) et
null
. Ils ne sont pas la même chose et devrait être utilisé de différentes manières.null
doit être utilisé pour indiquer l'absence de données,string.Empty
(ou""
) pour indiquer la présence de données, en fait, certains de texte vide. Est-il un cas spécifique où vous n'êtes pas sûr de ce qui est le plus approprié?Edit, ajout d'exemples:
Vous pouvez utiliser
string.Empty
comme postfix par défaut pour le nom d'une personne (la plupart des gens n'ont pas de Doctorat par exemple)Vous pouvez utiliser
null
pour une option de configuration qui n'a pas été spécifiée dans le fichier de configuration. Dans ce cas,string.Empty
serait utilisé si l'option de configuration est présent, mais les configurée valeur est une chaîne vide.string.Empty
ou""
lorsque vous souhaitez utiliser une chaîne vide etnull
quand vous voulez indiquer il n'y a pas de données. Vous pouvez utiliserstring.Empty
comme postfix par défaut pour le nom d'une personne (la plupart des gens n'ont pas de Doctorat par exemple) - etnull
pour une option de configuration qui n'a pas été spécifiée dans le fichier de configuration. Dans le second cas,string.Empty
serait utilisé si l'option de configuration est présent, mais les configurée valeur est une chaîne vide.Ils sont différents de ce que les autres ont déjà répondu.
Le problème avec la gestion de la chaîne vide vs null chaînes est en train de devenir un problème lorsque vous devez persister dans un fichier plat ou le transférer par le biais de communications, Donc je trouve qu'il pourrait être utile pour d'autres qui visitent cette page pour donner une belle solution à ce problème particulier.
Pour le but de sauver des chaînes dans un fichier ou de communication:
vous aurez probablement envie de convertir la chaîne en octets.
une bonne pratique que je recommande est d'ajouter 2 segments d'octets d'en-tête de votre chaîne convertie.
segment 1 - méta-informations qui sont stockées dans 1 octet, et décrit la longueur du segment suivant.
segment 2 - titulaire de la longueur de la chaîne pour être sauvé.
exemple:
la chaîne "abcd" - pour simplifier, je vais le convertir en ASCII à l'aide de l'encodeur et get {65,66,67,68}.
calculer le segment 2 aura un rendement de 4, donc 4 octets pour la longueur de la chaîne convertie.
calculer segment 1 rendement 1 - que seulement 1 octet est utilisé pour contenir les informations de longueur de la chaîne convertie de l'information (qui était de 4, c'est à dire si c'était de 260, je voudrais obtenir 2)
La nouvelle bande d'octets seront maintenant {1,4,65,66,67,68}, qui peuvent être sauvegardés dans un fichier.
L'avantage à l'égard de l'objet, c'est que si j'avais une chaîne vide pour enregistrer, je voudrais obtenir à partir de la conversion d'un tableau vide d'octets dans la longueur de 0 et d'après le calcul des segments je vais finir par avoir {1,0}, qui peuvent être sauvegardés et plus tard sur chargé et interprété de nouveau dans une chaîne vide.
D'autre part, si j'avais valeur null dans ma chaîne je finirais juste après avoir {0} comme mon tableau d'octets à enregistrer et à nouveau lors de la charge peut être interprété null.
Il y a plus d'avantages comme le fait de savoir ce que la taille pour être chargé ou s'accumuler si vous jag plusieurs chaînes de caractères.
Retour à l'objet - il.. bien gentil de polluer la pile les mêmes principes décrits sont utilisés par un système de différencier les valeurs null de vide.. donc oui chaîne.Vide prend plus de mémoire que la valeur null, bien que je n'appellerais pas cela de la pollution.. il a juste 1 octet de plus.
Il a été répondu à la mort, mais la valeur null signifie " pas de valeur, n'est pas initialisé. chaîne de caractères.Vide signifie "" (une chaîne vide) comme il est indiqué sur MSDN.
Le moyen le plus sûr de vérifier pour un vide ou une chaîne vide est l'aide de la chaîne.IsNullOrEmpty.
FWIW, je trouve que le mélange des
""
etString.Empty
ne fonctionne pas:En particulier, si vous utilisez
$.trim
pour obtenir la valeur d'un vide DOM champ de saisie, puis de le comparerString.Empty
, vous obtenezfalse
. Je ne sais pas pourquoi c'est bien, mais là vous allez. Je vient de l'utilisation""
partout pour des raisons de cohérence..Length==0
ou à l'aide de.Compare()