Dans la plupart des cas, une "chaîne" est (utilisée / traitée comme / pensée / supposée être) une unité atomique significative , tout comme un nombre .
Demander pourquoi les caractères individuels d'une chaîne ne sont pas mutables revient donc à demander pourquoi les bits individuels d'un entier ne sont pas mutables.
Tu devrais savoir pourquoi. Pensez-y.
Je déteste le dire, mais malheureusement, nous en débattons parce que notre langage est nul, et nous essayons d'utiliser un seul mot, une chaîne , pour décrire un concept ou une classe d'objet complexe et contextuellement situé.
Nous effectuons des calculs et des comparaisons avec des «chaînes», comme nous le faisons avec des nombres. Si les chaînes (ou les entiers) étaient mutables, nous aurions à écrire un code spécial pour verrouiller leurs valeurs dans des formes locales immuables afin d'effectuer n'importe quel type de calcul de manière fiable. Par conséquent, il est préférable de penser à une chaîne comme un identifiant numérique, mais au lieu d'avoir une longueur de 16, 32 ou 64 bits, elle pourrait comporter des centaines de bits.
Quand quelqu'un dit "string", nous pensons tous à des choses différentes. Ceux qui le considèrent simplement comme un ensemble de personnages, sans but particulier en tête, seront bien sûr consternés que quelqu'un vient de décider de ne pas pouvoir manipuler ces personnages. Mais la classe "string" n'est pas seulement un tableau de caractères. C'est un STRING
, pas un char[]
. Il y a quelques hypothèses de base sur le concept que nous appelons une «chaîne», et il peut généralement être décrit comme une unité atomique significative de données codées comme un nombre. Quand les gens parlent de "manipuler des chaînes", ils parlent peut-être vraiment de manipuler des caractères pour créer des chaînes , et un StringBuilder est parfait pour cela.
Considérez un instant ce que ce serait si les chaînes étaient mutables. La fonction API suivante pourrait être amenée à renvoyer des informations pour un utilisateur différent si la chaîne de nom d'utilisateur mutable est intentionnellement ou non modifiée par un autre thread pendant que cette fonction l'utilise:
string GetPersonalInfo( string username, string password )
{
string stored_password = DBQuery.GetPasswordFor( username );
if (password == stored_password)
{
//another thread modifies the mutable 'username' string
return DBQuery.GetPersonalInfoFor( username );
}
}
La sécurité n'est pas seulement une question de «contrôle d'accès», c'est aussi une question de «sécurité» et de «garantie d'exactitude». Si une méthode ne peut pas être facilement écrite et dépendante pour effectuer un simple calcul ou une comparaison de manière fiable, il n'est pas sûr de l'appeler, mais il serait prudent de remettre en question le langage de programmation lui-même.