OVH Cloud OVH Cloud

String.Empty

13 réponses
Avatar
ShadowFil
Bonjour,

Quel est l'intérêt d'utiliser "String.Empty" plutôt que "" ?

Merci de votre aide.

10 réponses

1 2
Avatar
Eric Vernié [MS]
Bonjour,

Dans un de ses posts Brad Abrams (Un des architectes des classes du
Framework .NET
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx), précise,
<<que la différence entre String.Empty et "" est très petite, mais il y à
une différence.
"" crée un objet alors que String.Empty n'en crée pas >>. L'utilisation
de String.Empty, d'après Brad <<semble plus efficace en terme de mémoire
occupée, mais que la différence est tellement infime que l'on ne verra sans
doute pas la différence dans son propre code>>

(En fin de compte String.Empty est un champ static de la classe String qui
est initialisé à "" dans un constructeur static)

A+

Eric Vernié
Microsoft France

"ShadowFil" a écrit dans le message de
news:
Bonjour,

Quel est l'intérêt d'utiliser "String.Empty" plutôt que "" ?

Merci de votre aide.


Avatar
Zazar
> Dans un de ses posts Brad Abrams (Un des architectes des classes du
Framework .NET
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx), précise,
<<que la différence entre String.Empty et "" est très petite, mais il y à
une différence.
"" crée un objet alors que String.Empty n'en crée pas >>. L'utilisation
de String.Empty, d'après Brad <<semble plus efficace en terme de mémoire
occupée, mais que la différence est tellement infime que l'on ne verra
sans
doute pas la différence dans son propre code>>

(En fin de compte String.Empty est un champ static de la classe String qui
est initialisé à "" dans un constructeur static)



Contrairement à ce que Brad dit, "" ne crée pas d'objet lors d'une
utilisation courante.
->Quand le JIT compile une méthode, chaque objet string constant qui est
trouvé est remplacé par l'objet de même valeur qui se trouve dans le pool
(si l'objet ne s'y trouve pas, il est créé puis placé dans le pool)
->Le compilateur static de la classe String affecte "" à String.Empty

Lors de la compilation du constructeur de String, le JIT place donc l'objet
"" dans le pool
interne.
->Par conséquent quand on écrit
str = "";
à la compilation, le JIT va remplacer "" par l'objet se trouvant dans le
pool; il n'y aura pas de création de nouvel objet.

Pour s'en convaincre :
object obj1 = "";
object obj2 = String.Empty;
Console.WriteLine(obj1 == obj2);
Ce code affiche true.

--
Zazar
Avatar
LEBRUN Thomas
Je me permet une petite remarque car j'avoue ne plus comprendre..

Zazar nous dit:

à la compilation, le JIT va remplacer "" par l'objet se trouvant dans le
pool; il n'y aura pas de création de nouvel objet.



mais juste avant, il nous explique:

chaque objet string constant qui est
trouvé est remplacé par l'objet de même valeur qui se trouve dans le pool
(si l'objet ne s'y trouve pas, il est créé puis placé dans le pool)



Donc, si j'ai bien saisi ce qu'il dit:
- à la compilation, si l'objet ne se trouve pas dans le pool, il est créé
puis placer dans le pool

Pr conséquent, il y a bien création d'objet :
Ou j'ai raté un épisode ?

Merci :)

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9


"Zazar" a écrit :


> Dans un de ses posts Brad Abrams (Un des architectes des classes du
> Framework .NET
> http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx), précise,
> <<que la différence entre String.Empty et "" est très petite, mais il y à
> une différence.
> "" crée un objet alors que String.Empty n'en crée pas >>. L'utilisation
> de String.Empty, d'après Brad <<semble plus efficace en terme de mémoire
> occupée, mais que la différence est tellement infime que l'on ne verra
> sans
> doute pas la différence dans son propre code>>
>
> (En fin de compte String.Empty est un champ static de la classe String qui
> est initialisé à "" dans un constructeur static)

Contrairement à ce que Brad dit, "" ne crée pas d'objet lors d'une
utilisation courante.
->Quand le JIT compile une méthode, chaque objet string constant qui est
trouvé est remplacé par l'objet de même valeur qui se trouve dans le pool
(si l'objet ne s'y trouve pas, il est créé puis placé dans le pool)
->Le compilateur static de la classe String affecte "" à String.Empty

Lors de la compilation du constructeur de String, le JIT place donc l'objet
"" dans le pool
interne.
->Par conséquent quand on écrit
str = "";
à la compilation, le JIT va remplacer "" par l'objet se trouvant dans le
pool; il n'y aura pas de création de nouvel objet.

Pour s'en convaincre :
object obj1 = "";
object obj2 = String.Empty;
Console.WriteLine(obj1 == obj2);
Ce code affiche true.

--
Zazar





Avatar
Zazar
Bonjour,
Zazar nous dit:

> à la compilation, le JIT va remplacer "" par l'objet se trouvant dans le
> pool; il n'y aura pas de création de nouvel objet.

mais juste avant, il nous explique:

> chaque objet string constant qui est
> trouvé est remplacé par l'objet de même valeur qui se trouve dans le


pool
> (si l'objet ne s'y trouve pas, il est créé puis placé dans le pool)

Donc, si j'ai bien saisi ce qu'il dit:
- à la compilation, si l'objet ne se trouve pas dans le pool, il est créé
puis placer dans le pool

Pr conséquent, il y a bien création d'objet :
Ou j'ai raté un épisode ?



Désolé si je n'ai pas été clair.
Il y a une et une seule création d'objet dans tout le process.
Quand le JIT va compiler le constructeur static de String, il va créer la
string "", la mettre dans le pool et modifier le code du constructeur pour
transformer le String.Empty = "" en String.Empty ObjetPlacéDansLePoolInterne.
Ensuite à chaque fois que le JIT va compiler du code contenant une
affectation du style, str = "", il va s'apercevoir que la string "" se
trouve dans le pool interne et va faire la même modification que
précédemment. Affecter String.Empty ou "" à une variable revient donc au
même, dans les 2 cas, on se retrouve avec le même objet.
Ceci n'est valable que quand on utilise directement "". Si on fait quelque
chose comme str = "FOOBAR".Substring(1,0); là une nouvelle String va être
créé au moment de l'exécution.

--
Zazar
Avatar
Bruno Jouhier [MVP]
> Donc, si j'ai bien saisi ce qu'il dit:
- à la compilation, si l'objet ne se trouve pas dans le pool, il est créé
puis placer dans le pool

Pr conséquent, il y a bien création d'objet :
Ou j'ai raté un épisode ?



Il y a aura en tout et pour tout UN SEUL objet "" dans le pool. Et même si
tu n'utilises jamais "" dans ton code, cet objet sera créé lorsque la classe
System.String sera initialisée.

Attention, dans le test que Zazar met à la fin de son post:

object obj1 = "";
object obj2 = String.Empty;
Console.WriteLine(obj1 == obj2);

Il est important d'utiliser des variables de type "object". Si on remplace
ça par des variables string, le test ne veut plus rien dire (car la classe
String surcharge l'opérateur == ). Je trouve que la variante suivante est un
peu plus claire:

Console.WriteLine(object.ReferenceEquals(String.Empty, ""));

Bruno.
Avatar
Bruno Jouhier [MVP]
"ShadowFil" a écrit dans le message de
news:
Bonjour,

Quel est l'intérêt d'utiliser "String.Empty" plutôt que "" ?

Merci de votre aide.



Il n'y a "pratiquement" aucune différence.

En cherchant la petite bête, on peut cependant trouver des cas où on
n'obtient pas le même résultat en remplaçant "" par String.Empty. Par
exemple:


Console.WriteLine(object.ReferenceEquals("" + "", ""));
Console.WriteLine(object.ReferenceEquals(String.Empty + "", ""));

Le premier imprime True car la concaténation des deux littéraux est faite à
la compilation.

Le second imprime False car la concaténation est faite à l'exécution (mais
je ne suis pas sûr que ça soit garanti car un compilateur plus malin
pourrait la faire en utilisant le fait que String.Empty est readonly -- la
spec C# autorise t'elle ça? Si elle l'autorise, alors on a le risque d'avoir
du code qui donne des résultats différents avec des compilateurs
différents).

Bruno.
Avatar
LEBRUN Thomas
OK donc en fait, il y a bien une premièr ecréation d'objet, puis ensuite, le
compilateur va réutiliser l'objet qui se trouve dans le pool.

Merci pour les explications, car, même si j'ai pour habitude d'utiliser
String.Empty, je me suis également poser la question de savoir s'il y avait
ou non une différence :)

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9


"Bruno Jouhier [MVP]" a écrit :

> Donc, si j'ai bien saisi ce qu'il dit:
> - à la compilation, si l'objet ne se trouve pas dans le pool, il est créé
> puis placer dans le pool
>
> Pr conséquent, il y a bien création d'objet :
> Ou j'ai raté un épisode ?

Il y a aura en tout et pour tout UN SEUL objet "" dans le pool. Et même si
tu n'utilises jamais "" dans ton code, cet objet sera créé lorsque la classe
System.String sera initialisée.

Attention, dans le test que Zazar met à la fin de son post:

object obj1 = "";
object obj2 = String.Empty;
Console.WriteLine(obj1 == obj2);

Il est important d'utiliser des variables de type "object". Si on remplace
ça par des variables string, le test ne veut plus rien dire (car la classe
String surcharge l'opérateur == ). Je trouve que la variante suivante est un
peu plus claire:

Console.WriteLine(object.ReferenceEquals(String.Empty, ""));

Bruno.





Avatar
Ambassadeur Kosh
Salut

je me demande bien d'ou viennent ces infos sur le JIT ? un lien ?

A+
Avatar
Bruno Jouhier [MVP]
AMA, ce n'est pas le JIT, mais plutôt le compilateur qui "interne" les
litéraux dans le pool. En Java par exemple, on peut (pouvait?) fonctionnner
avec ou sans le JIT, et dans les deux cas, les litéraux était "internés", ce
qui est normal car ça fait partie des specs du langage (le fait que 2 "Hello
World" à 2 endroits différents sont le même objet String).

Bruno.

"Ambassadeur Kosh" a écrit dans le message de
news:
Salut

je me demande bien d'ou viennent ces infos sur le JIT ? un lien ?

A+



Avatar
Ambassadeur Kosh
> AMA, ce n'est pas le JIT, mais plutôt le compilateur qui "interne" les
litéraux dans le pool. En Java par exemple, on peut (pouvait?)
fonctionnner avec ou sans le JIT, et dans les deux cas, les litéraux était
"internés", ce qui est normal car ça fait partie des specs du langage (le
fait que 2 "Hello World" à 2 endroits différents sont le même objet
String).



tout ça, je l'ai deduit avec mes petits neurones à moi, mais je n'en ai
jamais
vu la couleur dans un document quelque part. s'il y'en a un, par pitié,
montrez moi ou :)

A+
1 2