J'ai été surpris de voir un exemple de chaîne de caractères initialisée à null et à laquelle on ajoute quelque chose dans un environnement de production. Cela ne me semblait pas correct.
J'étais sûr que cela aurait déclenché une exception pour objet nul, mais cet exemple très réduit fonctionne également :
string sample = null;
sample += "test";
// sample equals "test"
* Notez que le code original que j'ai trouvé définit une propriété de chaîne à null et l'ajoute ailleurs, donc les réponses impliquant le compilateur optimisant le null au moment de la compilation ne sont pas pertinentes.
Quelqu'un peut-il expliquer pourquoi cela fonctionne sans erreur ?
Suivi :
Sur la base de la réponse de Leppie, j'ai utilisé Reflector pour voir ce qui se trouve dans string.Concat. La raison pour laquelle cette conversion a lieu est maintenant très évidente (pas de magie du tout) :
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}
** Remarque : l'implémentation spécifique que j'ai étudiée (dans la bibliothèque .Net de Microsoft) ne convertit pas les chaînes vides comme le suggèrent les normes C# et la plupart des réponses, mais utilise quelques tests pour raccourcir le processus. Le résultat final est le même que si elle le faisait, mais voilà :)