Dies ist eine späte Antwort auf eine alte Frage, aber allen anderen Antworten fehlt der Punkt, nämlich, dass .NET bis .NET 2.0 im Jahr 2005 keine Generika hatte.
Stringist ein Referenztyp anstelle eines Werttyps, da es für Microsoft von entscheidender Bedeutung war, sicherzustellen, dass Zeichenfolgen in nicht generischen Sammlungen wie z System.Collections.ArrayList.
Das Speichern eines Werttyps in einer nicht generischen Sammlung erfordert eine spezielle Konvertierung in den Typ, objectder als Boxen bezeichnet wird. Wenn die CLR einen Werttyp einfügt, wird der Wert in a eingeschlossen System.Objectund auf dem verwalteten Heap gespeichert.
Das Lesen des Werts aus der Sammlung erfordert die inverse Operation, die als Unboxing bezeichnet wird.
Sowohl das Boxen als auch das Unboxing verursachen nicht zu vernachlässigende Kosten: Das Boxen erfordert eine zusätzliche Zuordnung, das Unboxing erfordert eine Typprüfung.
Einige Antworten behaupten fälschlicherweise, dass stringsie niemals als Werttyp implementiert werden könnten, da ihre Größe variabel ist. Tatsächlich ist es einfach, eine Zeichenfolge als Datenstruktur mit fester Länge mithilfe einer Strategie zur Optimierung kleiner Zeichenfolgen zu implementieren: Zeichenfolgen werden direkt als Folge von Unicode-Zeichen im Speicher gespeichert, mit Ausnahme großer Zeichenfolgen, die als Zeiger auf einen externen Puffer gespeichert werden. Beide Darstellungen können so gestaltet werden, dass sie dieselbe feste Länge haben, dh die Größe eines Zeigers.
Wenn Generika vom ersten Tag an existiert hätten, wäre es wahrscheinlich eine bessere Lösung gewesen, einen String als Wertetyp zu haben, mit einer einfacheren Semantik, einer besseren Speichernutzung und einer besseren Cache-Lokalität. Eine, List<string>die nur kleine Zeichenfolgen enthält, könnte ein einzelner zusammenhängender Speicherblock gewesen sein.
isabgesehen von Tests), lautet die Antwort wahrscheinlich "aus historischen Gründen". Die Kopierleistung kann nicht der Grund sein, da unveränderliche Objekte nicht physisch kopiert werden müssen. Jetzt ist es unmöglich, Änderungen vorzunehmen, ohne den Code zu beschädigen, der tatsächlichisPrüfungen (oder ähnliche Einschränkungen) verwendet.