Une chaîne de caractères est un type de référence avec une sémantique de valeur. Cette conception est un compromis qui permet certaines optimisations des performances.
La distinction entre les types de référence et les types de valeur est essentiellement un compromis de performance dans la conception du langage. Les types de référence ont une certaine surcharge lors de la construction, de la destruction et du ramassage des déchets, car ils sont créés sur le tas. Les types de valeur, quant à eux, ont une surcharge lors des affectations et des appels de méthode (si la taille des données est supérieure à celle d'un pointeur), car l'objet entier est copié en mémoire plutôt qu'un simple pointeur. Comme les chaînes de caractères peuvent être (et sont généralement) beaucoup plus grandes que la taille d'un pointeur, elles sont conçues comme des types de référence. En outre, la taille d'un type de valeur doit être connue au moment de la compilation, ce qui n'est pas toujours le cas pour les chaînes de caractères.
Mais les cordes ont sémantique des valeurs ce qui signifie qu'ils sont immuables et comparés par valeur (c'est-à-dire caractère par caractère pour une chaîne de caractères), et non par comparaison de références. Cela permet certaines optimisations :
Stagiaire signifie que si plusieurs chaînes sont connues pour être égales, le compilateur peut se contenter d'utiliser une seule chaîne, ce qui économise de la mémoire. Cette optimisation ne fonctionne que si les chaînes sont immuables, sinon la modification d'une chaîne aurait des résultats imprévisibles sur les autres chaînes.
Littéraux de chaîne de caractères (qui sont connus au moment de la compilation) peuvent être internés et stockés dans une zone statique spéciale de la mémoire par le compilateur. Cela permet de gagner du temps au moment de l'exécution puisqu'il n'est pas nécessaire de les allouer et de les récupérer.
Les chaînes immuables augmentent le coût de certaines opérations. Par exemple, vous ne pouvez pas remplacer un seul caractère sur place, vous devez allouer une nouvelle chaîne pour tout changement. Mais il s'agit d'un coût minime par rapport aux avantages des optimisations.
La sémantique des valeurs masque effectivement la distinction entre les types de référence et les types de valeur pour l'utilisateur. Si un type a une sémantique de valeur, il importe peu à l'utilisateur que le type soit un type de valeur ou un type de référence - cela peut être considéré comme un détail d'implémentation.
0 votes
Étant donné que, pour les types immuables, la distinction est principalement un détail de mise en œuvre (laissant l
is
tests mis à part), la réponse est probablement "pour des raisons historiques". La performance de la copie ne peut pas être la raison puisqu'il n'y a pas besoin de copier physiquement des objets immuables. Maintenant, il est impossible de changer sans casser le code qui utilise effectivementis
des contrôles (ou des contraintes similaires).0 votes
BTW c'est la même réponse pour C++ (bien que la distinction entre les types valeur et référence ne soit pas explicite dans le langage), la décision de faire
std::string
se comporter comme une collection est une vieille erreur qui ne peut être réparée maintenant.