Aus einem kurzen Blick mit Reflector sieht es so aus, als ob String.Substring()
Speicher für jeden Teilstring reserviert. Habe ich Recht, dass dies der Fall ist? Ich dachte, das wäre nicht notwendig, da Strings unveränderlich sind.
Mein Ziel war es, eine IEnumerable<string> Split(this String, Char)
Erweiterungsmethode zu erstellen, die keinen zusätzlichen Speicher zuweist.
Ein Grund, warum die meisten Sprachen mit unveränderlichen Strings neue Teilstrings erzeugen, anstatt auf existierende Strings zu verweisen, liegt daran, dass dies die spätere Sammlung von Strings beeinträchtigt.
Was passiert, wenn ein String für seinen Teilstring verwendet wird, aber dann der größere String unerreichbar wird (außer durch den Teilstring). Die größere Zeichenfolge ist nicht abrufbar, da dies die Teilzeichenfolge ungültig machen würde. Was auf kurze Sicht eine gute Möglichkeit war, Speicher zu sparen, wird auf lange Sicht zu einem Speicherleck.
Nicht möglich, ohne innerhalb von .net mit String-Klassen herumzustochern. Sie müssten Referenzen auf ein Array weitergeben, das änderbar ist und sicherstellen, dass niemand vermasselt wird.
.Net erstellt jedes Mal eine neue Zeichenfolge, wenn Sie danach gefragt werden. Einzige Ausnahme hiervon sind internierte Strings, die vom Compiler erstellt werden (und von Ihnen erledigt werden können), die einmal in den Speicher geladen werden und dann aus Speicher- und Performance-Gründen Zeiger auf den String gesetzt werden.
Aus einem kurzen Blick mit Reflector sieht es so aus, als ob %code% Speicher für jeden Teilstring reserviert. Habe ich Recht, dass dies der Fall ist? Ich dachte, das wäre nicht notwendig, da Strings unveränderlich sind.
Mein Ziel war es, eine %code% Erweiterungsmethode zu erstellen, die keinen zusätzlichen Speicher zuweist.
Ein Grund, warum die meisten Sprachen mit unveränderlichen Strings neue Teilstrings erzeugen, anstatt auf existierende Strings zu verweisen, liegt daran, dass dies die spätere Sammlung von Strings beeinträchtigt.
Was passiert, wenn ein String für seinen Teilstring verwendet wird, aber dann der größere String unerreichbar wird (außer durch den Teilstring). Die größere Zeichenfolge ist nicht abrufbar, da dies die Teilzeichenfolge ungültig machen würde. Was auf kurze Sicht eine gute Möglichkeit war, Speicher zu sparen, wird auf lange Sicht zu einem Speicherleck.
Jeder String muss eigene String-Daten haben, so wie die String-Klasse implementiert ist.
Sie können Ihre eigene SubString-Struktur erstellen, die einen Teil einer Zeichenfolge verwendet:
%Vor%Sie können es mit anderen Methoden wie Vergleich, die auch ohne das Extrahieren der Zeichenfolge möglich ist, ausarbeiten.
Da Zeichenfolgen in .NET unveränderlich sind, weist jede Zeichenfolgenoperation, die zu einem neuen Zeichenfolgenobjekt führt, einen neuen Speicherblock für den Zeichenfolgeninhalt zu.
Theoretisch könnte es möglich sein, den Speicher beim Extrahieren einer Teilzeichenfolge wiederzuverwenden, aber das würde die Speicherbereinigung sehr kompliziert machen: Was ist, wenn die ursprüngliche Zeichenkette durch Müll gesammelt wird? Was würde mit der Teilzeichenkette passieren, die ein Teil davon teilt?
Natürlich verhindert nichts, dass das .NET BCL-Team dieses Verhalten in zukünftigen .NET-Versionen ändern kann. Es hätte keine Auswirkungen auf den vorhandenen Code.
Hinzufügen zu dem Punkt, dass Strings unveränderlich sind, sollten Sie sein, dass das folgende Snippet mehrere String-Instanzen im Speicher generiert.
%Vor%s1 + s2 = & gt; Neue String-Instanz (temp1)
temp1 + s3 = & gt; neue String-Instanz (temp2)
res ist eine Referenz auf temp2.
Jeder String muss eigene String-Daten haben, so wie die String-Klasse implementiert ist.
Sie können Ihre eigene SubString-Struktur erstellen, die einen Teil einer Zeichenfolge verwendet:
%Vor%Sie können es mit anderen Methoden wie Vergleich, die auch ohne das Extrahieren der Zeichenfolge möglich ist, ausarbeiten.
Da Zeichenfolgen in .NET unveränderlich sind, weist jede Zeichenfolgenoperation, die zu einem neuen Zeichenfolgenobjekt führt, einen neuen Speicherblock für den Zeichenfolgeninhalt zu.
Theoretisch könnte es möglich sein, den Speicher beim Extrahieren einer Teilzeichenfolge wiederzuverwenden, aber das würde die Speicherbereinigung sehr kompliziert machen: Was ist, wenn die ursprüngliche Zeichenkette durch Müll gesammelt wird? Was würde mit der Teilzeichenkette passieren, die ein Teil davon teilt?
Natürlich verhindert nichts, dass das .NET BCL-Team dieses Verhalten in zukünftigen .NET-Versionen ändern kann. Es hätte keine Auswirkungen auf den vorhandenen Code.
Hinzufügen zu dem Punkt, dass Strings unveränderlich sind, sollten Sie sein, dass das folgende Snippet mehrere String-Instanzen im Speicher generiert.
%Vor%s1 + s2 = & gt; Neue String-Instanz (temp1)
temp1 + s3 = & gt; neue String-Instanz (temp2)
res ist eine Referenz auf temp2.
Tags und Links string memory .net c# string-interning