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.

3 réponses

1 2
Avatar
Zazar
Bonsoir,

C'était aussi une déduction de mes petits neurones.Ca se fait à l'exécution
:

[STAThread]
static void Main(string[] args)
{
string str1 = "FOO";
string str2 = "BAR";
Console.WriteLine(string.IsInterned(str1 + str2));
MyMethod();
Console.WriteLine(string.IsInterned(str1 + str2));
}

[System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.Compiler
Services.MethodImplOptions.NoInlining)]
static void MyMethod() {
string str = "FOOBAR";
str.Substring(5);
}

Et si ça se fait à l'exécution, je ne vois que 2 possibilités :
-> soit c'est le JIT qui s'en charge
-> soit c'est le code compilé
La deuxième solution étant catastrophique au niveau performances, je suppose
que ce n'est pas elle, mais il faudrait décompiler un programme pour s'en
assurer.

--
Zazar
Avatar
Zazar
Bonsoir,


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).



A ma connaissance, la spec ne dit pas que "" + "" doit être remplacé à la
compilation par "". On n'est donc déjà en présence d'un comportement
indéfini dans le premier cas.

--
Zazar
Avatar
Bruno Jouhier [MVP]
> A ma connaissance, la spec ne dit pas que "" + "" doit être remplacé à la
compilation par "". On n'est donc déjà en présence d'un comportement
indéfini dans le premier cas.



C'est vrai en Java (section 3.10.5 du Gosling/Joy/Steele). J'ai peut-être
généralisé un peu vite à C#.

Bruno.


--
Zazar




1 2