351 votes

Quelle est la différence entre String.Empty et "" (chaîne vide) ?

Dans .NET, quelle est la différence entre String.Empty y "" et sont-elles interchangeables, ou y a-t-il une référence sous-jacente ou des problèmes de localisation concernant l'égalité ? String.Empty veillera à ce qu'il n'y ait pas de problème ?

6 votes

La vraie question n'est PAS ce que plutôt pourquoi . Pourquoi Microsoft a créé string.Empty et quel était le raisonnement derrière le fait de le déclarer comme readonly au lieu de const .

362voto

Brian R. Bondy Points 141769

Dans .NET avant la version 2.0, "" crée un objet tandis que string.Empty ne crée aucun objet réf. ce qui rend string.Empty plus efficace.

Dans les versions 2.0 et ultérieures de .NET, toutes les occurrences de l'expression "" font référence à la même chaîne littérale, ce qui signifie que "" est équivalent à .Empty mais toujours pas aussi rapide que .Length == 0 .

.Length == 0 est l'option la plus rapide, mais .Empty permet d'obtenir un code légèrement plus propre.

Ver el .NET pour plus d'informations .

106 votes

"" n'aurait de toute façon créé un objet qu'une seule fois en raison de l'internage des chaînes. En fait, le compromis sur les performances n'est rien - la lisibilité est plus importante.

16 votes

Il est intéressant de noter que même si la question ne dit rien sur la comparaison d'une chaîne de caractères avec "" ou string.Empty pour vérifier les chaînes vides, beaucoup de personnes semblent interpréter la question de cette façon...

14 votes

Je serais prudent avec .Length == 0, car cela peut déclencher une exception si votre variable chaîne est nulle. Si vous le vérifiez par rapport à "", il retournera simplement false sans exception.

239voto

Habib Points 93087

quelle est la différence entre String.Empty et "", et sont-ils interchangeables

string.Empty est un champ en lecture seule alors que "" est une constante de temps de compilation. Les endroits où ils se comportent différemment sont :

Valeur par défaut du paramètre en C# 4.0 ou supérieur

void SomeMethod(int ID, string value = string.Empty)
// Error: Default parameter value for 'value' must be a compile-time constant
{
    //... implementation
}

Expression de cas dans une instruction de commutation

string str = "";
switch(str)
{
    case string.Empty: // Error: A constant value is expected. 
        break;

    case "":
        break;

}

Arguments d'attributs

[Example(String.Empty)]
// Error: An attribute argument must be a constant expression, typeof expression 
//        or array creation expression of an attribute parameter type

27 votes

Intéressant, je ne pensais pas que cette vieille question obtiendrait de nouvelles informations pertinentes. J'avais tort.

0 votes

Je pense que votre exemple n°1 Valeur par défaut du paramètre en C# 4.0 ou supérieur est essentiellement une duplication de votre exemple #3 Arguments d'attributs car je crois que .NET déploie les paramètres par défaut dans les attributs. Donc, plus fondamentalement, vous ne pouvez tout simplement pas mettre une "valeur" (d'exécution) (dans ce cas, une instance poignée pour les plus pointilleux) en métadonnées (de compilation).

0 votes

@GlennSlayden, je ne suis pas d'accord avec vous. L'initialisation des attributs est différente d'une initialisation ordinaire. C'est parce que vous pouvez passer l'attribut String.Empty comme argument dans la plupart des cas. Vous avez raison de dire que tous les exemples montrent que you simply can't put a (run-time) "value" into (compile-time) metadata et c'est ce que les exemples visent à montrer.

48voto

chadmyers Points 3010

Les réponses précédentes étaient correctes pour .NET 1.1 (regardez la date de l'article qu'ils ont lié : 2003). À partir de .NET 2.0 et plus, il n'y a plus de 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

Chaque littéral de chaîne ne donne pas nécessairement lieu à une nouvelle instance de chaîne. Lorsque deux littéraux de chaîne ou plus qui sont équivalents selon l'opérateur d'égalité de chaîne (section 7.9.7) apparaissent dans le même assemblage, ces littéraux de chaîne font référence à la même instance de chaîne.

Quelqu'un en parle même dans les commentaires du billet de Brad Abram.

En résumé, le résultat pratique de "" contre String.Empty est nul. Le JIT finira par s'en rendre compte.

Personnellement, j'ai découvert que le JIT est bien plus intelligent que moi et j'essaie donc de ne pas être trop malin avec des optimisations de micro-compilateur comme celles-ci. Le JIT déploie les boucles for(), supprime le code redondant, inline les méthodes, etc. mieux et à des moments plus appropriés que le compilateur C# ou moi-même ne pourrions jamais anticiper. Laissez le JIT faire son travail :)

1 votes

Petite coquille ? "Le JIT finira par référencer le même objet sur l'aide de toute façon." Vous vouliez dire "sur le tas" ?

0 votes

Question populaire connexe stackoverflow.com/questions/263191/

43voto

James Newton-King Points 13880

String.Empty es un en lecture seule champ tandis que "" es un const . Cela signifie que vous ne pouvez pas utiliser String.Empty dans une instruction switch car il ne s'agit pas d'une constante.

0 votes

Avec l'avènement de la default nous pouvons améliorer la lisibilité sans mot-clé, empêcher toute modification accidentelle et disposer d'une constante de compilation, même si, pour être honnête, je pense toujours que String.Empty est plus lisible que le mot-clé par défaut, mais plus lent à taper.

4 votes

@Enzoaeneas A default La chaîne est nulle et non vide. Le site default à tous les objets de référence est nulle.

12voto

Eugene Katz Points 2784

Les réponses ci-dessus sont techniquement correctes, mais ce que vous voulez vraiment utiliser, pour une meilleure lisibilité du code et le moins de chance d'une exception, c'est String.IsNullOrEmpty(s)

5 votes

En ce qui concerne la comparaison de l'égalité, je suis tout à fait d'accord, mais la question portait également sur la différence entre les deux concepts ainsi que sur la comparaison.

3 votes

Attention, "moins de chance d'obtenir une exception" signifie souvent "plus de chance de continuer mais de faire quelque chose de mal". Par exemple, si vous avez un argument de ligne de commande que vous analysez et que quelqu'un appelle votre application avec --foo=$BAR alors vous voudrez probablement repérer la différence entre le fait qu'ils oublient de définir une var env et le fait qu'ils ne transmettent pas du tout l'indicateur. string.IsNullOrEmpty est souvent un signe de code indiquant que vous n'avez pas validé correctement vos entrées ou que vous faites des choses bizarres. Vous ne devriez généralement pas accepter les chaînes vides lorsque vous voulez vraiment utiliser null ou quelque chose comme un type Peut-être / Option.

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