Ils sont différents, comme d'autres 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);
}
Résultats :
- false - puisque null est différent de string.empty
- false - puisque null est différent de ""
- true - puisque "" est identique à string.empty
Le problème de la gestion des chaînes de caractères vides par rapport aux chaînes de caractères nulles devient un problème lorsque vous avez besoin de les conserver dans un fichier plat ou de les transférer par des communications. Je pense donc qu'il pourrait être utile pour les autres personnes qui visitent cette page de donner une bonne solution à ce problème particulier.
Dans le but d'enregistrer des chaînes de caractères 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 stockée dans un octet et décrivant la longueur du segment suivant.
segment 2 - contient la longueur de la chaîne à sauvegarder.
exemple :
chaîne "abcd" - pour simplifier, je vais la convertir en utilisant l'encodeur ASCII et j'obtiendrai {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 - puisqu'un seul octet a été utilisé pour contenir l'information sur la longueur de la chaîne convertie (qui était de 4, c'est-à-dire que si elle était de 260, j'obtiendrais 2)
La nouvelle bande d'octets sera maintenant {1,4,65,66,67,68} et pourra être enregistrée dans un fichier.
L'avantage par rapport au sujet est que si j'avais une chaîne vide à sauvegarder, j'obtiendrais de la conversion un tableau vide d'octets de longueur 0 et après avoir calculé les segments, j'obtiendrais {1,0} qui peut être sauvegardé et plus tard chargé et réinterprété en 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 à sauvegarder et, une fois chargé, il pourrait être interprété comme étant nul.
Il y a d'autres avantages, comme le fait de savoir quelle est la taille à charger ou à accumuler si l'on jagge plusieurs chaînes.
Pour en revenir au sujet, cela polluera en quelque sorte la pile car les mêmes principes décrits sont utilisés par n'importe quel système pour différencier les nuls des vides donc oui string.Empty prend plus de mémoire que null, bien que je n'appellerais pas cela une pollution c'est juste 1 octet de plus.
1 votes
Je ne suis pas tout à fait sûr de savoir pourquoi vous feriez l'un ou l'autre... pouvez-vous donner un peu plus du code dont vous parliez à titre d'exemple ?
0 votes
Il n'y a pas de code. J'ai demandé à mon collègue de regarder quelque chose que je déboguais et il m'a dit qu'en règle générale, "n'utilisez pas string.empty" et mettez-le à null car il va sur la pile. Personnellement, j'ai toujours utilisé string.Empty car au moment où il est sorti, il était censé être la bonne chose à utiliser plutôt que "".
0 votes
Voir aussi : En C#, dois-je utiliser string.Empty ou String.Empty ou "" ?
0 votes
Ce que je veux dire, c'est que...
string.Empty
,""
ynull
sont toutes des valeurs constantes, mais elles sont toutes suffisamment "simples" pour que je ne voie pas pourquoi vous en assigneriez une à une variable. Si vous avez besoin de capturer unout
pourquoi ne pas simplement utiliserstring myString;
?8 votes
De nos jours, les arguments sur des sujets tels que celui-ci qui ne sont pas axés sur la lisibilité et la sémantique et qui se concentrent sur des micro-optimisations absurdes sont faibles, au mieux. Utilisez celui qui signifie la chose correcte pour votre contexte donné. (par exemple, si vous savez que quelqu'un n'a pas de deuxième prénom, vous utilisez
String.Empty
; si vous ne savez pas si quelqu'un a un deuxième prénom ou non, vous utiliseznull
). Ensuite, une fois que vous avez le bon sens, écrivez le code de manière à ce qu'il soit clairement correct et facilement maintenu.0 votes
@jason, si on n'a pas de deuxième prénom, pourquoi ne pas utiliser
null
pour indiquer "pas de deuxième prénom" ? J'interprète une chaîne vide ici comme "a un deuxième prénom, et est vide", ce qui semble étrange.