Für die meisten Zwecke ist eine "Zeichenfolge" (verwendet / behandelt als / gedacht / angenommen) eine bedeutungsvolle atomare Einheit, genau wie eine Zahl .
Die Frage, warum die einzelnen Zeichen einer Zeichenfolge nicht veränderbar sind, entspricht der Frage, warum die einzelnen Bits einer Ganzzahl nicht veränderbar sind.
Sie sollten wissen warum. Denken Sie nur darüber nach.
Ich hasse es, es zu sagen, aber leider diskutieren wir darüber, weil unsere Sprache scheiße ist, und wir versuchen, ein einzelnes Wort, eine Zeichenfolge , zu verwenden, um ein komplexes, kontextbezogenes Konzept oder eine Klasse von Objekten zu beschreiben.
Wir führen Berechnungen und Vergleiche mit "Strings" durch, ähnlich wie wir es mit Zahlen tun. Wenn Zeichenfolgen (oder Ganzzahlen) veränderbar wären, müssten wir speziellen Code schreiben, um ihre Werte in unveränderliche lokale Formen zu sperren, damit jede Art von Berechnung zuverlässig durchgeführt werden kann. Daher ist es am besten, sich eine Zeichenfolge wie eine numerische Kennung vorzustellen, aber anstatt 16, 32 oder 64 Bit lang zu sein, kann sie Hunderte von Bit lang sein.
Wenn jemand "String" sagt, denken wir alle an verschiedene Dinge. Diejenigen, die es einfach als eine Reihe von Charakteren ohne besonderen Zweck betrachten, werden natürlich entsetzt sein, dass jemand gerade entschieden hat, dass sie diese Charaktere nicht manipulieren können sollten. Die "string" -Klasse besteht jedoch nicht nur aus einer Reihe von Zeichen. Es ist ein STRING
, kein char[]
. Es gibt einige grundlegende Annahmen über das Konzept, das wir als "Zeichenfolge" bezeichnen, und es kann allgemein als sinnvolle atomare Einheit codierter Daten wie eine Zahl beschrieben werden. Wenn Leute über das "Manipulieren von Strings" sprechen, sprechen sie vielleicht wirklich über das Manipulieren von Zeichen , um Strings zu erstellen , und ein StringBuilder ist dafür großartig.
Überlegen Sie sich für einen Moment, wie es wäre, wenn Zeichenfolgen veränderlich wären. Die folgende API-Funktion könnte dazu verleitet werden, Informationen für einen anderen Benutzer zurückzugeben, wenn die veränderbare Benutzernamenzeichenfolge absichtlich oder unbeabsichtigt von einem anderen Thread geändert wird, während diese Funktion sie verwendet:
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 );
}
}
Bei Sicherheit geht es nicht nur um "Zugangskontrolle", sondern auch um "Sicherheit" und "Gewährleistung der Korrektheit". Wenn eine Methode nicht einfach geschrieben und abhängig gemacht werden kann, um eine einfache Berechnung oder einen Vergleich zuverlässig durchzuführen, ist es nicht sicher, sie aufzurufen, aber es wäre sicher, die Programmiersprache selbst in Frage zu stellen.