web-dev-qa-db-fra.com

string.Empty vs null.Qui utilisez-vous?

Récemment, un collègue de travail m'a dit de ne pas utiliser string.Empty lors de la définition d'une variable chaîne mais utilisez null car cela pollue la pile?

Il dit de ne pas faire

string myString=string.Empty; mais faites string mystring=null;

Est-ce que c'est vraiment important? Je sais que la chaîne est un objet, donc cela a du sens.

Je sais que c'est une question stupide, mais quelle est votre opinion?

79
user712923

null et Empty sont très différents, et je ne suggère pas de basculer arbitrairement entre eux. Mais ni l'un ni l'autre n'a de "coût" supplémentaire, puisque Empty est une référence fixe unique (vous pouvez l'utiliser un certain nombre de fois).

Il n'y a pas de "pollution" sur la pile causée par un ldsfld - cette préoccupation est .... folle. Charger un null est sans doute marginalement moins cher, mais pourrait entraîner des exceptions de référence nulle si vous n'êtes pas 'attention à vérifier la valeur.

Personnellement, je n'utilise ni l'un ni l'autre ... Si je veux une chaîne vide j'utilise "" - simple et évident. L'internement signifie que ceci aussi n'a pas de surcharge par utilisation.


Au niveau IL, la différence ici entre "" et Empty est juste ldstr vs ldsfld - mais les deux donnent la même référence de chaîne internée unique. De plus, dans les versions .NET plus récentes, le JIT a une interception directe de celles-ci, produisant la référence de chaîne vide sans faisant en fait une recherche de champ statique. Fondamentalement, il n'y a aucune raison de s'en soucier, à l'exception de la lisibilité. J'utilise juste "".

102
Marc Gravell

Cela ne "pollue pas la pile", il n'y a pas de raison technique mais il y a une grande différence entre définir une variable sur 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 doivent être utilisés 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 du texte vide. Y a-t-il un cas spécifique où vous n'êtes pas sûr de ce qui est le plus approprié?

Modifier, ajouter des exemples:

  • Vous pouvez utiliser string.Empty comme suffixe 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 non spécifiée dans le fichier de configuration. Dans ce cas, string.Empty serait utilisé si l'option config était présente, mais la valeur configurée souhaitée était une chaîne vide.

28
Kieren Johnstone

Ils sont différents comme d'autres l'ont déjà répondu.

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

Le problème de la gestion des chaînes vides par rapport aux chaînes nulles devient un problème lorsque vous devez soit le persister dans un fichier plat ou le transférer via les communications, donc je trouve qu'il pourrait être utile pour ceux qui visitent cette page de donner une bonne solution à ce problème particulier.

Pour enregistrer des chaînes dans un fichier ou des communications:
vous voudrez probablement convertir la chaîne en octets.
une bonne pratique que je recommande est d'ajouter 2 segments d'octets d'en-tête à votre chaîne convertie.

segment 1 - méta-info qui est stockée dans 1 octet et décrit la longueur du segment suivant.

segment 2 - contient la longueur de la chaîne à enregistrer.

Exemple:
chaîne "abcd" - pour simplifier je vais la convertir en utilisant ASCII encodeur et obtiendra {65,66,67,68}.
calculer le segment 2 donnera 4 - donc 4 octets sont la longueur de la chaîne convertie.
calculer le segment 1 donnera 1 - car seulement 1 octet a été utilisé pour contenir les informations de longueur des informations de chaîne converties (qui était 4, c'est-à-dire que si c'était 260, j'obtiendrais 2)

La nouvelle bande d'octets sera désormais {1,4,65,66,67,68} qui peut être enregistrée dans un fichier.

L'avantage par rapport au sujet est que si j'avais une chaîne vide à enregistrer, j'obtiendrais de la conversion un tableau vide d'octets de 0 et après avoir calculé les segments, je finirai par avoir {1,0} qui peut être enregistré et ensuite chargé et interprété de nouveau dans une chaîne vide. D'un autre côté, si j'avais une valeur nulle dans ma chaîne, je finirais par avoir juste {0} comme tableau d'octets à enregistrer et une fois chargé, il pourra être interprété de nouveau comme nul.

Il y a plus d'avantages tels que savoir quelle est la taille à charger ou à accumuler si vous déchiquetez plusieurs chaînes.

Revenons au sujet - cela polluera bien la pile car les mêmes principes que ceux décrits sont utilisés par n'importe quel système pour différencier les valeurs nulles des valeurs vides .. donc oui chaîne. appelons ça de la pollution .. c'est juste 1 octet de plus.

8
G.Y

Il a été répondu à mort, mais null signifie aucune valeur, non initialisé. string.Empty signifie "" (une chaîne vide) comme indiqué sur MSDN.

La façon la plus sûre de rechercher une chaîne vide ou nulle est d'utiliser string.IsNullOrEmpty.

1
Carlos A Merighe