Dans .NET, quelle est la différence entre String.Empty
et ""
, et sont-ils interchangeables, ou existe-t-il des problèmes de référence ou de localisation sous-jacents autour de l'égalité qui String.Empty
garantiront que ce n'est pas un problème?
.net
double-quotes
string
johnc
la source
la source
string.Empty
et quelle était la raison d'être de le déclarer aureadonly
lieu deconst
.Réponses:
Dans .NET avant la version 2.0,
""
crée un objet tout enstring.Empty
ne créant aucune référence d' objet , ce qui rendstring.Empty
plus efficace.Dans la version 2.0 et les versions ultérieures de .NET, toutes les occurrences de
""
font référence au même littéral de chaîne, ce qui signifie qu'il""
est équivalent à.Empty
, mais pas aussi rapide que.Length == 0
..Length == 0
est l'option la plus rapide, mais.Empty
permet un code légèrement plus propre.Voir la spécification .NET pour plus d'informations .
la source
string.IsNullOrEmpty( stringVar )
.string.Empty
est un champ en lecture seule alors qu'il""
s'agit d'une constante de temps de compilation. Les endroits où ils se comportent différemment sont:Valeur de paramètre par défaut en C # 4.0 ou supérieur
Expression de casse dans l'instruction switch
Arguments d'attribut
la source
String.Empty
argument comme argument dans la plupart des cas. Vous avez raison que tous les exemples le montrentyou simply can't put a (run-time) "value" into (compile-time) metadata
et c'est ce que les exemples visent à montrer.Les réponses précédentes étaient correctes pour .NET 1.1 (regardez la date du message qu'ils ont lié: 2003). À partir de .NET 2.0 et versions ultérieures, il n'y a essentiellement aucune différence. Le JIT finira par référencer le même objet sur le tas de toute façon.
Selon la spécification C #, section 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Quelqu'un le mentionne même dans les commentaires du post de Brad Abram
En résumé, le résultat pratique de "" par rapport à String.Empty est nul. Le JIT le découvrira à la fin.
J'ai trouvé, personnellement, que le JIT est bien plus intelligent que moi et j'essaie donc de ne pas devenir trop intelligent avec des optimisations de micro-compilateurs comme ça. Le JIT se déroulera pour les boucles (), supprimera le code redondant, les méthodes en ligne, etc. mieux et à des moments plus appropriés que moi ou le compilateur C # n'aurais jamais pu prévoir auparavant. Laissez le JIT faire son travail :)
la source
String.Empty
est un champ en lecture seule tandis que""
est un const . Cela signifie que vous ne pouvez pas l'utiliserString.Empty
dans une instruction switch car ce n'est pas une constante.la source
default
mot - clé, nous pouvons promouvoir la lisibilité sans, empêcher les modifications accidentelles et avoir une constante de compilation, mais pour être honnête, je pense toujours que String.Empty est plus lisible que par défaut, mais plus lent à taperUne autre différence est que String.Empty génère un code CIL plus volumineux. Alors que le code pour référencer "" et String.Empty est de la même longueur, le compilateur n'optimise pas la concaténation de chaînes (voir le blog d' Eric Lippert ) pour les arguments String.Empty. Les fonctions équivalentes suivantes
générer cet IL
la source
"bar " + (ok ? "" : "error")
Les réponses ci-dessus sont techniquement correctes, mais ce que vous voudrez peut-être vraiment utiliser, pour une meilleure lisibilité du code et moins de risques d'exception, c'est String.IsNullOrEmpty (s)
la source
--foo=$BAR
vous souhaiterez probablement faire la différence entre le fait d'oublier de définir une variable env et celui de ne pas passer le drapeau du tout.string.IsNullOrEmpty
est souvent une odeur de code que vous n'avez pas validé correctement vos entrées ou que vous faites des choses étranges. Vous ne devriez généralement pas accepter de chaînes vides lorsque vous comptez vraiment les utilisernull
, ou quelque chose comme un type Maybe / Option.J'ai tendance à utiliser
String.Empty
plutôt que""
pour une raison simple, mais pas évidente:""
et ne""
sont pas les mêmes, le premier a en fait 16 caractères de largeur nulle. Évidemment, aucun développeur compétent ne mettra de caractères de largeur nulle dans leur code, mais s'ils y parviennent, cela peut être un cauchemar de maintenance.Remarques:
J'ai utilisé U + FEFF dans cet exemple.
Je ne sais pas si SO va manger ces caractères, mais essayez-le vous-même avec l'un des nombreux caractères de largeur nulle
Je ne l'ai découvert que grâce à https://codegolf.stackexchange.com/
la source
Utilisez
String.Empty
plutôt que""
.Référence:
String.Empty
vs""
la source
String.Empty ne crée pas d'objet contrairement à "". La différence, comme indiqué ici , est cependant insignifiante.
la source
Toutes les instances de "" sont les mêmes, littérales de chaînes internes (ou elles devraient l'être). Donc, vous ne lancerez vraiment pas un nouvel objet sur le tas chaque fois que vous utilisez "", mais vous créerez simplement une référence au même objet interné. Cela dit, je préfère la chaîne vide. Je pense que cela rend le code plus lisible.
la source
Ça n'a pas d'importance!
Quelques discussions passées à ce sujet:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
la source
ldstr
envoie une nouvelle référence d'objet à un littéral de chaîne stocké dans les métadonnées.ldsfld
pousse la valeur d'un champ statique sur la pile d'évaluationJ'ai tendance à utiliser à la
String.Empty
place de""
parce qu'à mon humble avis, c'est plus clair et moins VB-ish.la source
Voici quelques résultats de Roslyn x64 en janvier 2019. Malgré les remarques consensuelles des autres réponses sur cette page, il ne me semble pas que le JIT x64 actuel traite tous ces cas de manière identique, quand tout est dit et fait.
Notez en particulier, cependant, qu'un seul de ces exemples finit par appeler
String.Concat
, et je suppose que c'est pour des raisons de correction obscures (par opposition à une surveillance d'optimisation). Les autres différences semblent plus difficiles à expliquer.default (String) + {default (String), "", String.Empty}
"" + {default (String), "", String.Empty}
String.Empty + {default (String), "", String.Empty}
Détails du test
la source
En venant à cela d'un point de vue Entity Framework: EF versions 6.1.3 semble traiter String.Empty et "" différemment lors de la validation.
string.Empty est traité comme une valeur nulle à des fins de validation et générera une erreur de validation s'il est utilisé dans un champ Obligatoire (attribué); où "" passera la validation et ne générera pas l'erreur.
Ce problème peut être résolu dans EF 7+. Référence: - https://github.com/aspnet/EntityFramework/issues/2610 ).
Modifier: [Obligatoire (AllowEmptyStrings = true)] résoudra ce problème, permettant à string.Empty de valider.
la source
Puisque String.Empty n'est pas une constante de compilation, vous ne pouvez pas l'utiliser comme valeur par défaut dans la définition de fonction.
la source
public void test(int i=0, string s=string.Empty) {}
ne compilera pas et ne dira pas "La valeur par défaut du paramètre pour 's' doit être une constante de temps de compilation. La réponse d'OP fonctionne.Lorsque vous scannez visuellement le code, "" apparaît colorisé comme les chaînes sont colorisées. string.Empty ressemble à un accès régulier aux membres de la classe. Lors d 'un rapide coup d' œil, il est plus facile de "" repérer ou de comprendre le sens.
Repérez les chaînes (la colorisation du débordement de la pile n'aide pas vraiment, mais en VS, c'est plus évident):
la source
\u00ad
.Tout le monde ici a donné une bonne clarification théorique. J'avais un doute similaire. J'ai donc essayé un codage de base dessus. Et j'ai trouvé une différence. Voici la différence.
Il semble donc que «Null» signifie absolument nul et «String.Empty» signifie qu'il contient une sorte de valeur, mais qu'il est vide.
la source
""
versusstring.Empty
. Ce n'est qu'en essayant de dire si la chaîne est vide que celanull
a été mentionné.