Warum wurde String als Referenztyp anstatt als Werttyp entworfen?
Aus der Modellierungsperspektive hätte ich es als Werttyp modelliert, da es etwas ohne Identität darstellt. Es hat keine unterscheidenden Attribute. (ZB kann ich keinen Unterschied zwischen einer Zeichenfolge "a" und einer anderen Zeichenfolge "a") machen
Ich weiß, dass ich ernsthafte Leistungsprobleme mit langen Strings auf dem Stack gehabt hätte. Wahrscheinlich ist es unmöglich, da die Strings sehr lang werden, da der Stack in der Größe begrenzt ist.
Wenn Sie nicht die Leistung hätten, warum würden Sie System.String als Referenztyp entwerfen? (Angenommen, eine mögliche Zeichenfolge ist höchstens 16 Byte lang)
Structs muss sein, um eine feste Größe zu haben. Denken Sie zum Beispiel an ein string[]
. Die einzige Möglichkeit, wie Sie string
als Werttyp verwenden könnten, wäre, nur den Zeiger zu speichern. Was im Wesentlichen ist, erreichen wir durch Verwendung eines Referenztyps.
Natürlich ist es auch sehr vorteilhaft, dass wir die Zeichenfolge nicht jedes Mal kopieren, wenn wir sie zuweisen.
Wenn Sie darauf hinweisen, dass ein Werttyp, der sehr groß werden kann, aufgrund des begrenzten Stack-Speicherplatzes und der Semantik zum Kopieren bei Verwendung von Werttypen prohibitiv sein kann.
Auch die Art, wie Strings in .NET implementiert werden, fügt der Gleichung ein paar Elemente hinzu. Zeichenfolgen sind nicht nur Referenztypen, sie sind auch unveränderlich (außerhalb des Systemnamespace sowieso) und die Laufzeit verwendet Interning, um nette Tricks für Zeichenfolgen auszuführen.
Dies alles hat mehrere Vorteile: Doppelte Literalstrings werden nur einmal gespeichert und der Vergleich solcher Strings wird extrem effektiv, da Sie Referenzen anstelle von Strömen von Unicode-Zeichen vergleichen können. Diese Optionen wären für Werttypen nicht möglich.
Nach meinem Verständnis sind Strings unveränderliche Klassen anstelle von Strukturen only als Performancegewinn.
Strings werden in der Regel erstellt und dann an viele Objekte übergeben, um sie an einen Benutzer zu rendern oder an andere Systeme weiterzugeben. Nach ihrer Erstellung ändern sich die Zeichenfolgen nicht. Daher hat das Kopieren des gesamten Zeichenarrays als eindeutiger Wert in jedem Objekt wenig praktischen Wert und erzeugt viele temporäre Objekte.
Einfach - weil ich nicht jedes Mal, wenn ich eins in eine Methode überführe, Kopien von Strings machen möchte. Es braucht mehr Speicher und es braucht mehr Zeit.
Ein Punkt ist, dass der String-Typ wie in vielen Sprachen als Unicode codiert ist und es daher unlogisch ist, sie als primitive Typen zu behandeln (wie int
), da es keine direkte Entsprechung zwischen ihrer binären Codierung und ihrer menschlichen Leseform gibt.
Die Unicode-Ebene qualifiziert Zeichenketten, die abstrahiert werden sollen, automatisch von binär, während Zahlen zwischen den Formaten Basis 2 (binär) und Basis 10 (dezimal) relativ einfach austauschbar sind.
Der Grund, warum primitive Variablen auf dem Stapel liegen können, ist, dass für viele Zahlen genügend Platz zur Verfügung steht. Dies ist nicht der Fall für den data heavy String
-Typ.
Die Arten von Operationen, die an Strings ausgeführt werden, sind nicht wirklich arithmetisch, sondern basieren auf mehr Boolescher Logik (außer wenn Strings gezählt werden, wenn sie wie ein Vektor oder Array behandelt werden). Daher ist es sinnvoll, die Datenstruktur für ihre primären Verwendungen zu optimieren. über den System.String-Namespace.
Tags und Links string c# value-type